在SQL中查找重复项
我试图在非传统场景中找到重复的场景: 样本表:在SQL中查找重复项,sql,sql-server,Sql,Sql Server,我试图在非传统场景中找到重复的场景: 样本表: id1 | id2 -----+----- ABC | DEF DEF | ABC 我只想保留其中一行,因为这些ID显示了彼此之间的连接。过滤第二行最优雅的方法是什么?这里有一种方法: select id1, id2 from t where id1 < id2 or not exists (select 1 from t t2 where t2.id
id1 | id2
-----+-----
ABC | DEF
DEF | ABC
我只想保留其中一行,因为这些ID显示了彼此之间的连接。过滤第二行最优雅的方法是什么?这里有一种方法:
select id1, id2
from t
where id1 < id2 or
not exists (select 1
from t t2
where t2.id1 = t.id2 and t2.id2 = t.id1
);
注意:这假设id1和id2永远不相等,尽管您可以为此调整逻辑
SELECT *
FROM YourTable t
WHERE EXISTS
(
SELECT 1
FROM YourTable t2
WHERE t2.id1 = t.id2
AND t2.id2 = t.id1
AND t2.id1 > t2.id2
);
此外,如果数据中除了翻转之外还有重复项,则需要选择distinct或类似的机制来删除它们。使用case和distinct
它将还原某些行中的列。如果3,4被视为等同于4,3,那么这应该不是问题。找到DUP,但只保留id1小于id2的DUP 一个EXISTS可以用于此
SELECT *
FROM YourTable t
WHERE EXISTS
(
SELECT 1
FROM YourTable t2
WHERE t2.id1 = t.id2
AND t2.id2 = t.id1
AND t2.id1 > t2.id2
);
您能添加所用数据库的标记吗?我更新了上面的表,ID可以是varchar,不需要大于或小于实际值,这没什么大不了的。”DEF的字母顺序比ABC大。但是如果您需要先插入ID最低的一个,则需要另一个SQL。我更新了上表,ID可以是varchar,不需要大于或小于than@lilerer . . . 这将适用于字符串或任何类型than@lilerer,如果将DEF | ABC视为等同于ABC | DEF,则它仍然有效。