删除SQL Server中的互惠项集

时间:2015-12-18 14:03:43

标签: sql-server tsql sql-server-2012

我有一个查询,它生成一个订单号列表和两个列[Item1],[Item2]中的项目集。问题是它也产生了对的反转,所以我总是为每个项目对最终得到2行,我只想要一行。这与无向边缘基本相同。

例如。 {1234,ProductA,ProductB}和{1234,ProductB,ProductA}是重复的,应删除一个。

我尝试了这个,但它不起作用(0结果)。我在这个问题SQL -- Remove duplicate pairs

中找到了代码
SELECT
    OrderId,
    Item1,
    Item2
FROM
    cte_pairs t1
WHERE
     NOT EXISTS (
        SELECT 
        OrderId,Item1,Item2 
        FROM cte_pairs t2
        WHERE t2.OrderId=t1.OrderId 
            AND t2.Item1=t1.Item2
            AND t2.Item2=t1.Item1
    )

编辑 - 内部CTE表 在这里为CTE添加了代码,有一种方法可以防止链条中的重复更高。

注意,vOrderItems处于sku级别。由于Group1Name是一个类别,因此SELECT DISTINCT用于删除那些重复的行。

SELECT
    a.OrderId,
    a.Group1Name Item1,
    b.Group1Name Item2
FROM
    (
        SELECT DISTINCT
            OrderId,
            Group1Name
        FROM
            vOrderItems
    ) a

    JOIN

    (
        SELECT DISTINCT
            OrderId,
            Group1Name
        FROM
            vOrderItems
    ) b
    ON
        a.OrderId=b.OrderId

WHERE
    a.Group1Name<>b.Group1Name

2 个答案:

答案 0 :(得分:1)

您可以“排序”这些项目,然后使用标准DISTINCT

SELECT DISTINCT
    OrderId,
    CASE WHEN Item1 < Item2 THEN Item1 ELSE Item2 END AS Item1,
    CASE WHEN Item1 < Item2 THEN Item2 ELSE Item1 END AS Item2
FROM
    cte_pairs

这可以保证相同的行生成完全相同的项目顺序,重复项将被丢弃

答案 1 :(得分:1)

在CTE中更改此行:

a.Group1Name<>b.Group1Name

对此:

a.Group1Name<b.Group1Name

CTE不会产生相反的行。