我有一张类似于的表: -
+----+---+---+
| Id | A | B |
+----+---+---+
| 1 | 1 | 2 |
+----+---+---+
| 2 | 2 | 1 |
+----+---+---+
| 3 | 3 | 4 |
+----+---+---+
| 4 | 0 | 5 |
+----+---+---+
| 5 | 5 | 0 |
+----+---+---+
Run Code Online (Sandbox Code Playgroud)
我想删除所有重复的值对,无论哪个列包含哪个值,例如在我想查看的查询之后: -
+----+---+---+
| Id | A | B |
+----+---+---+
| 1 | 1 | 2 |
+----+---+---+
| 3 | 3 | 4 |
+----+---+---+
| 4 | 0 | 5 |
+----+---+---+
Run Code Online (Sandbox Code Playgroud)
我想在Microsoft SQL Server中找到一个解决方案(必须在<= 2005中工作,尽管我对任何依赖于> = 2008功能的解决方案感兴趣).
另外,请注意A和B将在1-100范围内(但不能永远保证.它们是代理种子整数外键,但外表可能会增长到最多几百行).
我想知道我是否在这里错过了一些明显的解决方案.发生的事情似乎都过于紧张,尽管我认为他们可能会工作,例如: -
提前致谢!
测试数据和样本如下.
基本上,我们使用OR标准进行自连接,因此a = a和b = b OR a = b且b = a.
该WHERE子查询为您提供了最大的每一对来消除.
我认为这也适用于一式三份(注意我添加了第6行).
DECLARE @t table(id int, a int, b int)
INSERT INTO @t
VALUES
(1,1,2),
(2,2,1),
(3,3,4),
(4,0,5),
(5,5,0),
(6,5,0)
SELECT *
FROM @t
WHERE id NOT IN (
SELECT a.id
FROM @t a
INNER JOIN @t b
ON (a.a=b.a
AND a.b=b.b)
OR
(a.b=b.a
AND a.a = b.b)
WHERE a.id > b.id)
Run Code Online (Sandbox Code Playgroud)
小智 5
尝试:
select min(Id) Id, A, B
from (select Id, A, B from DuplicatesTable where A <= B
union all
select Id, B A, A B from DuplicatesTable where A > B) v
group by A, B
order by 1
Run Code Online (Sandbox Code Playgroud)