2017-07-25 28 views
-2

所以我有這些表:SQL是有可能使用和/或HAVING子句

Products 
-------- 
Product ID | Quantity 

OrdersLines 
----------- 
Product ID | Amount --(multiple lines with the same ID) 

我使用這個選擇:

SELECT 
P.ProductID, 
P.Quantity, 
SUM(OL.Amount) AS Ordered 
FROM atbl_Sales_Products AS P 
INNER JOIN atbl_Sales_OrdersLines AS OL ON OL.ProductID = P.ProductID 
GROUP BY P.ProductID, P.Quantity 
HAVING P.Quantity > SUM(OL.Amount) 

如果兩個表中都使用ProductID,則該選擇正常工作。 但是,如果未在OrdersLines表中使用,或者Amount在該表中爲Null - 這些行不包括在內。

+1

根據你的文章的標題,是的,一個'HAVING'子句可以使用'AND','OR'或者任何其他在WHERE子句中使用的操作符。唯一需要注意的是'HAVING'子句必須對彙總進行操作(比如'sum()','max()'等) – Xedni

+0

所以主要問題是如果這能解決我的問題:) – Benua

+1

假設你的問題超過只是帖子的標題,到底什麼是你的問題? – Xedni

回答

2

當您想要跨表加入時,但始終需要包含來自一方或另一方的記錄,則需要使用OUTER JOIN之一,而不是SQL中的INNER JOIN之一。如果您想包含atbl_Sales_Products中的記錄,即使atbl_Sales_OrderLines中可能沒有匹配的記錄,但使用相同的ProductID,那麼您應該使用LEFT JOIN

正如在評論中提到的,您可以使用子句中的WHERE子句中使用的任何運算符。

+0

是的,這是一個有效的評論。如果我刪除「HAVING P.Quantity> SUM(OL.Amount)」行並將其更改爲LEFT JOIN - 我從Products表中獲取所有行的表格,並從OrdersLines獲取總量。但是,對於總量(在OrdersLines中)高於Products.Quantity的行,沒有篩選器。 – Benua

+0

我想他說的是使用'LEFT OUTER JOIN',並且保留你的'HAVING'子句。 – Xedni

1

SELECT 
 
\t P.ProductID, 
 
\t P.Quantity, 
 
\t SUM(OL.Amount) AS Ordered 
 
FROM atbl_Sales_Products AS P 
 
LEFT JOIN atbl_Sales_OrdersLines AS OL 
 
ON P.ProductID = OL.ProductID 
 
GROUP BY P.ProductID, P.Quantity 
 
HAVING SUM(OL.Amount) IS NULL 
 
OR P.Quantity > SUM(Ol.Amount)

額外或語句解決我的問題。