Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中查找重复项_Sql_Sql Server - Fatal编程技术网

在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,则它仍然有效。