sql - 查找具有完全相同的子行集的 Sql 父行

标签 sql sql-server left-join

我有一个包含订单的 MS SQL 数据库。有两个表 orers 和 orderrow。 我想获取具有相同订单的所有订单:这意味着显示具有完全相同的产品和数量的订单。

创建表和数据:

CREATE TABLE [dbo].[orders](
    [orderid] [int] NULL
) ON [PRIMARY]

GO

INSERT INTO orders values(1)
INSERT INTO orders values(2)
INSERT INTO orders values(3)
INSERT INTO orders values(4)

CREATE TABLE [dbo].[orderrows](
    [orderid] [int] NULL,
    [LineNum] [int] NULL,
    [Quantity] [decimal](18, 6) NULL,
    [ItemCode] [nvarchar](20) NULL
) ON [PRIMARY]

GO

INSERT INTO orderrows values(1,0,11.0,'Item1')
INSERT INTO orderrows values(1,1,12.0,'Item2')
INSERT INTO orderrows values(1,2,13.0,'Item3')
INSERT INTO orderrows values(1,3,14.0,'Item4')
INSERT INTO orderrows values(2,0,11.0,'Item1')
INSERT INTO orderrows values(2,1,12.0,'Item2')
INSERT INTO orderrows values(2,2,13.0,'Item3')
INSERT INTO orderrows values(2,3,14.0,'Item4')
INSERT INTO orderrows values(3,0,11.0,'Item1')
INSERT INTO orderrows values(3,1,12.0,'Item2')
INSERT INTO orderrows values(4,0,15.0,'Item5')
INSERT INTO orderrows values(4,1,16.0,'Item6')

我创建了这个查询:

select t1.orderid, t1.Itemcode, t1.quantity, t1.LineNum, t2.orderid, t2.Itemcode 
FROM orderrows t1
    LEFT OUTER JOIN orderrows t2 ON t1.itemcode = t2.ItemCode and t1.quantity = t2.Quantity and t2.LineNum = t1.linenum
    where t1.orderid <> t2.orderid
    order by t1.orderid, t2.orderid

这给出了以下结果:

enter image description here

有人知道如何去掉划掉的行吗?这些订单并不完全匹配,而是仅包含订单行的子集。例如第 5 行和第 6 行显示订单 3,但该订单只有 item1 和 item2。

最佳答案

这是一种方法 - 构建 orderid 的所有组合,然后使用 EXCEPT 消除不匹配的订单。我假设 LineNum 与“精确”比较无关。

-- Build up all combinations of orders
WITH orderPairs AS
(
    select o1.orderid as orderid1, o2.orderid as orderid2
    from orders o1
        cross join orders o2
    where 
        o1.orderid > o2.orderid -- prevent self matches, and duplicate checks
)
SELECT *
  FROM orderPairs op
  WHERE 
    NOT EXISTS
    -- All in O1 are in O2
    (SELECT ItemCode, Quantity 
      FROM orderrows orw1 
      WHERE orw1.orderid = op.orderid1 

      EXCEPT 

      SELECT ItemCode, Quantity 
      FROM orderrows orw2 
      WHERE orw2.orderid = op.orderid2)

    AND NOT EXISTS

    -- All in O2 are in O1
    (SELECT ItemCode, Quantity 
     FROM orderrows orw2 
      WHERE orw2.orderid = op.orderid2

      EXCEPT 

      SELECT ItemCode, Quantity 
      FROM orderrows orw1 
      WHERE orw1.orderid = op.orderid1 )

这不一定是最有效的方法(例如,早期行计数可以避免逐行匹配)

SqlFiddle here ,即表示 Order1Order2 相同。

关于sql - 查找具有完全相同的子行集的 Sql 父行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27148191/

相关文章:

php - 将 fetch all 数组拆分为单独的数组

PHP 比较 2 个整数并用更大的整数更新表

sql - 在不知道父行是什么的情况下,删除父行时删除子行的最简单方法是什么?

sql - 递归CTE结果是无限的

mysql - Symfony2 查询在两个表上使用左连接

php - 如何从2个表中获取所有数据并显示所有不工作的数据

SQL:使用 IN 子句将字符串转换为 IDS

sql-server - 如何将 Excel 电子表格导入 SQL Server?

mysql - 同一个表上的多个 LEFT JOIN 语句

sql - Postgresql在ubuntu中更改数据目录