我一直在尝试使用两个表格中的数据制作一个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);
表格看起来像这样(如果这更容易看到
)产品表
订单表
我通过以下查询取得了部分成功
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 :(得分:2)
对于您的方法,您可以继续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)
上的索引),这会有更好的表现,因为它不需要一次汇总所有数据。
答案 1 :(得分:0)
Couple of ways to achieve the results. You need to add a WHERE clause after your ON that tells the SQL to only return parts with a TotalQuantity greater than 0.
You could also add the p.TotalQuantity > 0 to the ON statement.