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

查找具有完全相同的子行集的Sql父行,sql,sql-server,left-join,Sql,Sql Server,Left Join,我有一个MS SQL数据库和订单。有两个表orers和orderrows。 我想得到所有订单,有相同的订单:这意味着显示订单有完全相同的产品和数量 创建表和数据: 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

我有一个MS SQL数据库和订单。有两个表orers和orderrows。 我想得到所有订单,有相同的订单:这意味着显示订单有完全相同的产品和数量

创建表和数据:

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
选择t1.orderid、t1.Itemcode、t1.quantity、t1.LineNum、t2.orderid、t2.Itemcode
来自订单行t1
t1.itemcode=t2.itemcode和t1.quantity=t2.quantity和t2.LineNum=t1.LineNum上的左外部联接顺序行t2
其中t1.orderid t2.orderid
按t1.orderid、t2.orderid排序
这将产生以下结果:


有人知道如何摆脱划掉的一排吗?这些订单并不完全匹配,但只有orderrows的一个子集。e、 g.第5行和第6行显示顺序3,但此顺序仅包含项目1和项目2。

这里有一种方法-构建所有OrderID组合,然后使用除之外的
来消除不匹配的顺序。我假设
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 )
这不一定是最有效的方法(例如,早期行计数可以避免逐行匹配)


,即表明
Order1
Order2
是相同的。

如果我理解正确,您需要将每个订单的全套行与其他全套行进行比较。另外,您是否可以澄清,
完全相同的产品和数量
,而您的SqlQuery在比较中也使用了
LineNum
——如果切换了
LineNums
,但订单项和数量相同,订单是否会被视为不同?“相同订单”的定义公开进行内部辩论-我们已经从比较中取消了LineNum。因此@StuartLC的解决方案已经过测试并被接受,谢谢!将
LineNum
添加到组合中与将其添加到4 x selects一样简单,即
SELECT ItemCode,Quantity,LineNum…
任何使用linq解决相同问题的解决方案?任何使用linq解决相同问题的解决方案?@suraj13k这是一个完全不同的问题(这纯粹是一个SQL问题)-您需要问一个新问题,如果您已经在LINQ中对集合比较进行了详尽的搜索。但是LINQ的
.Except()、All()和.Contains()
扩展应该足以让您找到答案。是的,如果我不明白,我会问一个问题。我使用All()、Any()和Where()扩展实现了这一点。