2017-07-31 45 views
0

我一直在嘗試使用兩個表中的數據進行Select語句,該語句將僅返回庫存中的產品,並且遇到問題。 我有2張桌子。一個列出產品,另一個訂單。產品中的數據是靜態的。如何根據剩餘數量選擇行

表可以使用這些線路

create table Products (ProductID integer, TotalQuantity integer); 
insert into Products values (1, 1); 
insert into Products values (2, 2); 
insert into Products values (3, 20); 
insert into Products values (4, 10); 
insert into Products values (5, 20); 
insert into Products values (6, 10); 
insert into Products values (7, 5); 
insert into Products values (8, 50); 
insert into Products values (9, 1); 

create table Orders (OrderID integer, ProductID integer, Amount integer); 
insert into Orders values (6, 4, 1); 
insert into Orders values (6, 6, 1); 
insert into Orders values (6, 1, 1); 
insert into Orders values (47, 4, 1); 
insert into Orders values (6, 9, 1); 
insert into Orders values (5, 7, 1); 
insert into Orders values (6, 2, 2); 

和表格創建這個樣子(如果這是更容易查看

產品表 Products table

訂單表 Orders table

我通過以下查詢取得了部分成功

SELECT p.ProductID, p.TotalQuantity 
FROM Products p 
JOIN Orders o 
ON o.ProductID = p.ProductID 
GROUP BY p.ProductID, o.Amount, p.TotalQuantity 
HAVING SUM(o.Amount) < p.TotalQuantity 

但是,這隻會返回已訂購產品的結果。那些沒有包括在內(應該得到id爲3,5,8的產品)。

我讀過,我可以將2選擇查詢合併爲一個,但我不知道如何得到不訂購的產品。

SELECT p.ProductID, p.TotalQuantity 
FROM Products p 
JOIN Orders o 
ON o.ProductID != p.ProductID 

這不會返回預期值。

+0

你應該用你正在使用的數據庫標記問題(儘管在這種情況下它不影響答案)。 –

回答

3

對於你的方法,你可以繼續LEFT JOIN

SELECT p.ProductID, p.TotalQuantity 
FROM Products p LEFT JOIN 
    Orders o 
    ON o.ProductID = p.ProductID 
GROUP BY p.ProductID, o.Amount, p.TotalQuantity 
HAVING COALESCE(SUM(o.Amount), 0) < p.TotalQuantity; 

另一種方式來寫,這將是與WHERE子句中相關子查詢:

SELECT p.* 
FROM Products p 
WHERE p.TotalQuantity > (SELECT COALESCE(SUM(o.Amount), 0) 
         FROM Orders o 
         WHERE o.ProductID = p.ProductID 
         ); 

在很多情況下(即索引Orders(ProductID, Amount)),這將有更好的表現,因爲它不需要一次彙總所有數據。

+0

所以在第二個例子中,我需要在某處使用coalesce,然後才能得到與第一個案例相同的結果? 'SELECT COALESCE(SUM(o.Amount),0)' – NulisDefo

+0

@NulisDefo。 。 。接得好。 –

+0

你介意解釋第二個例子是如何工作的嗎?我以前從未遇到過COALESCE。在這種情況下,我似乎有點困惑。第二個查詢計算總和將經過每個p.ProductID並與第一個查詢進行比較。當它到達p.ProductID = 3時,o.ProductID沒有等價的結果,或者換句話說結果是NULL,因此它改變它以便有一些結果(即0),並將其與p.TotalQuantity進行比較,其中p.ProductID = 3.我理解正確嗎? – NulisDefo

0

幾種方法來實現結果。 您需要在ON之後添加WHERE子句,以指示SQL僅返回TotalQuantity大於0的部分。

您還可以將p.TotalQuantity> 0添加到ON語句。

+0

它總是TotalQuantity> 0. TotalQuantity表示尚未送出的產品數量 – NulisDefo