2014-11-06 52 views
0

我期望看到每個供應商已與每個客戶(間接通過分銷商)完成的總美元業務的細分,其中我試圖不使用語法Inner Join。我基本上不了解由如下所示的兩個查詢所產生的兩個輸出端之間的差:嘗試瞭解查詢中的NULL運算符

查詢1

select customers.cust_id, vendors.vend_id, sum(OrderItems.item_price*OrderItems.quantity) as total_business from 
(((Vendors left outer join products 
on vendors.vend_id = products.prod_id) 
left outer join OrderItems 
on products.prod_id = OrderItems.prod_id) 
left outer join Orders 
on OrderItems.order_num = Orders.order_num) 
left outer join Customers 
on Orders.cust_id = Customers.cust_id 
group by Customers.cust_id, vendors.vend_id 
order by total_business 

我得到以下輸出: enter image description here

QUERY2

select customers.cust_id, Vendors.vend_id, sum(quantity*item_price) as total_business from 
(((Vendors left outer join Products 
on Products.vend_id = Vendors.vend_id) 
left outer join OrderItems --No inner joins allowed 
on OrderItems.prod_id = Products.prod_id) 
left outer join Orders 
on Orders.order_num = OrderItems.order_num) 
left outer join Customers 
on Customers.cust_id = Orders.cust_id 
where Customers.cust_id is not null -- THE ONLY DIFFERENCE BETWEEN QUERY1 AND QUERY2 
group by Customers.cust_id, Vendors.vend_id 
order by total_business 

enter image description here

我不明白如何只有NULLcust_id的第一個輸出關聯在第二個輸出時,我們得到一些非空cust_id s。爲什麼不第一輸出包括這些非NULL cust_id

謝謝

回答

0

當你離開加入到一個表,然後在該表中篩選在where子句中,連接有效地改變成內部聯接。解決方法是將過濾器應用爲連接條件。

在你的第二個查詢中,你所要做的就是將單詞「where」改爲「and」。

1

查詢一個是加盟廠商和產品錯誤:

on vendors.vend_id = products.prod_id -- Vend_ID = Prod_ID

查詢二是正確連接供應商和產品:

on Products.vend_id = Vendors.vend_id -- Vend_ID = Vend_ID

一旦是固定的,你會得到兩個查詢中都有相同的ID。然後,我建議您閱讀Dan的答案,以便理解爲什麼您試圖通過向鏈中最後一個表的列添加WHERE過濾器來消除查詢中的INNER JOIN