如何根据左侧数量选择行

时间:2017-07-31 11:56:47

标签: sql

我一直在尝试使用两个表格中的数据制作一个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

这不会返回预期值。

2 个答案:

答案 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.