我有一个包含以下字段的表格。
我的桌子上有以下条目。
我想比较两个OrderId,并得到一个结果,以了解两个订单中都存在哪些ItemId,而哪些不存在。
我需要的结果如下。
ItemId:两个订单中都存在200。
ItemId:201存在于100中,而不存在于101
ItemId:202和203存在于101中,而不是存在于100中。
我不确定是否可以通过SQL完成此操作。
任何帮助将不胜感激。预先感谢。
用于测试的SQL脚本:
Create table #Orders(OrderId INT, ItemId INT)
Insert into #Orders Select 100, 200
Insert into #Orders Select 100, 201
Insert into #Orders Select 101, 200
Insert into #Orders Select 101, 202
Insert into #Orders Select 101, 203
答案 0 :(得分:1)
您需要先进行CROSS JOIN
,然后进行LEFT JOIN
来检查可用性。
当您有多个订单和物品时,您想要的输出不是最好的检查方法,以下输出应该足够好:
;WITH AllOrders AS
(
SELECT DISTINCT O.OrderID FROM #Orders AS O
),
AllItems AS
(
SELECT DISTINCT O.ItemId FROM #Orders AS O
)
SELECT
OrderId = O.OrderId,
ItemId = I.ItemId,
IsItemInOrder = CASE WHEN A.OrderId IS NOT NULL THEN 1 ELSE 0 END
FROM
AllOrders AS O
CROSS JOIN AllItems AS I
LEFT JOIN #Orders AS A ON
O.OrderId = A.OrderId AND
I.ItemId = A.ItemId
ORDER BY
O.OrderId,
I.ItemId
结果:
OrderId ItemId IsItemInOrder
100 200 1
100 201 1
100 202 0
100 203 0
101 200 1
101 201 0
101 202 1
101 203 1
答案 1 :(得分:1)
一种方法...
DECLARE @O1 INT = 100, @O2 INT = 101;
SELECT FirstOrderID = @O1,
SecondOrderId = @O2,
FirstOrderItemId = MAX(CASE WHEN OrderId =@O1 THEN ItemId END),
SecondOrderItemId = MAX(CASE WHEN OrderId =@O2 THEN ItemId END)
FROM #Orders
WHERE OrderId IN (@O1, @O2)
GROUP BY ItemId
答案 2 :(得分:1)
如果只需要两个订单,则可以执行以下操作:
select coalesce(oi1.orderid, 100), coalesce(oi2.orderid, 101), oi1.itemid, oi2.itemid
from (select oi.*
from orderitems oi
where oi.orderid = 100
) oi1 full join
(select oi.*
from orderitems oi
where oi.orderid = 101
) oi2
on oi2.orderid <> oi1.orderid and
oi2.itemid = oi1.itemid;
Here是db <>小提琴。
这回答了您提出的问题。如果您想将其推广到更多订单,请问另一个问题。这并不像您想象的那么容易推广。
答案 3 :(得分:0)
为什么不使用CROSS JOIN
?
SELECT DISTINCT t.Orderid, tt.ItemID
FROM table t CROSS JOIN
(SELECT DISTINCT ItemId FROM table t1) t1 LEFT OUTER JOIN
table tt
ON tt.Orderid = t.Orderid AND t1.Itemid = tt.ItemId;
为比较理想的结果,如果您比较一个或多个订单编号,则需要采用更动态的方法。因此,CROSS JOIN
在这种情况下有助于查找不匹配的itemid。
答案 4 :(得分:0)
在您撰写本文时:“我想比较两个OrderId,并得出一个结果,以了解两个订单中都存在ItemIds,不存在。” >
只需使用INNER JOIN
-结果集将包含两个订单中的所有ItemID:
SELECT A.ItemID
FROM dbo.yourtable A
INNER JOIN dbo.yourtable B
ON A.ItemID = B.ItemID
AND B.OrderID = 101
WHERE A.OrderID = 100