我有一个名为OrderItems的表。我想写一个返回数量= 1的行的查询,但如果有任何其他记录具有相同的OrderID,我不想要返回任何内容。
Id OrderID Qty SKU
1 123 1 abc123
2 124 2 sho221
3 125 1 toy903
4 125 3 ball05
5 155 1 gree32
使用上面的示例数据,我希望仅返回订单123和155,因为它们适用于数量为1的单个SKU。订单125有两个SKU,即使第一个(Id 3)的数量为1 ,另一个(Id 4)的数量为3,所以我不希望这些订单返回。
到目前为止,我正在玩的查询是:
SELECT o.Id
FROM Orders o
INNER JOIN OrderItems oi
ON oi.OrderId = o.Id
WHERE oi.Quantity = 1
GROUP BY eo.Id
但是这个查询没有考虑具有多个SKU的订单,只是订单碰巧有SKU的数量为1。
用简单的英语 - 我想找到只包含一个SKU的订单,而且这些订单必须有一个数量。
答案 0 :(得分:4)
我认为你也可以这样做:
SELECT
oi.OrderId,
sum(oi.Quantity)
FROM
Orders o
INNER JOIN OrderItems oi
ON oi.OrderId = o.Id
group by
oi.OrderId
having
sum(oi.Quantity) = 1 and
count(*) = 1
答案 1 :(得分:3)
您没有指定SQL Server版本,但使用组计数将无需加入OrderItems
:
select *
from
(
select *,
count(*) over (partition by orderId) as cnt
from OrderItems
) dt
where cnt = 1 and Qty = 1
如果效率更高取决于实际数据......
答案 2 :(得分:2)
为每个订单添加您的订单数量否,如果它是一个,那就是您需要的。 要选择任何列,您可以再次加入orderItem表
select * from
OrderItems x inner join
(
select orderId, sum(Qty) AS NetQty
from OrderItems
group by orderId
having sum(Qty) =1
) t
on t.orderId = x.orderId
答案 3 :(得分:2)
一种简单的方法是使用窗口函数:
select oi.*
from (select oi.*, sum(oi.quantity) over (partition by oi.OrderId) as totqty
from OrderItems oi
) oi
where totqty = 1;
该版本很不错,因为您可以轻松获取OrderItems
中的所有列。如果您只想要订单ID:
select oi.orderid
from OrderItems oi
group by oi.orderid
having sum(oi.quantity) = 1;
这两者的关键是join
到Orders
是不必要的。
答案 4 :(得分:0)
您可以使用exists
运算符检查相同SKU的其他项目
SELECT *
FROM orders a
WHERE qty = 1 AND
NOT EXISTS (SELECT *
FROM orders b
WHERE a.orderid = b.orderid AND a.id != b.id)
答案 5 :(得分:0)
表现:
SELECT o.Id
FROM Orders o
INNER JOIN OrderItems oi
ON oi.OrderId = o.Id
LEFT JOIN OrderItems oi1
ON oi.OrderId = oi1.OrderId
AND oi.Id <> oi1.Id
WHERE oi.Qty = 1
AND oi1.id IS NULL