我有一个查询,它生成一个订单号列表和两个列[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
)
答案 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不会产生相反的行。