SQL:如何获取匹配和不匹配的记录

时间:2019-02-13 12:38:16

标签: sql sql-server join jointable

我有一个包含以下字段的表格。

  1. OrderId
  2. ItemId

我的桌子上有以下条目。

enter image description here

我想比较两个OrderId,并得到一个结果,以了解两个订单中都存在哪些ItemId,而哪些不存在。

我需要的结果如下。

enter image description here

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

5 个答案:

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