如何过滤相反的重复项

时间:2016-06-22 08:52:57

标签: sql duplicates multiple-columns

有一个包含以下列的表:

ID Parent Child
1  A      B
2  B      A
3  C      D
4  E      F
5  D      C
...

如何获取列Parent + Child与Child + Parent相同的条目?

E.g。 ID和1的条目在组合它们的列时是相同的。所以结果应该只是一个ID为1或2

的条目

所以结果集应如下所示:

ID Parent Child
1  A      B
3  C      D
4  E      F
...

在合并父母与子女或子女与父母时,重复的每个条目都不应成为结果的一部分。

更多信息:列表示表之间的关系。因此,如果父母与孩子之间存在关系,我就不需要另外一个从孩子到父母的关系。

我自己的结论是,这个问题不能用SQL语句来解决,需要一个循环,但我希望有人在那里教我更好。 提前谢谢!

更新: 我的最小例子没有考虑到每列中的值都不像我写的那么容易。它们是通过(替换(newid(),' - ','')生成的,并且是guid的afaik。所以,我不确定它是否可能将它们与通常的运算符(如<,>,=)进行比较,如果最新的newid()确实是>以前的newid()? 有没有其他方法可以解决这个问题? 实际上,表格如下所示:

ID                                 Parent                             Child
6C57C330EB5A4DF8BC245A245569A97C   FF42FB32F3FC463EA3366FAB7425E706   7FEF3100E5F149EFB27967F0BE95FFC8
9AD0035D04FA4695AE7854F4BE29FF60   7FEF3100E5F149EFB27967F0BE95FFC8   FF42FB32F3FC463EA3366FAB7425E706

到目前为止感谢!

3 个答案:

答案 0 :(得分:1)

您可以使用以下查询:

SELECT MIN(ID),
       CASE WHEN Parent < Child THEN Parent ELSE Child END,
       CASE WHEN Parent >= Child THEN Parent ELSE Child END
FROM mytable
GROUP BY CASE WHEN Parent < Child THEN Parent ELSE Child END,
         CASE WHEN Parent >= Child THEN Parent ELSE Child END

答案 1 :(得分:1)

您可以轻松实现这一目标:

SELECT * FROM YourTable t
WHERE t.Parent > t.Child

这样做如下:在每一对中(除非它们可以相同,我怀疑)其中一个必须大于另一个,因此 - 这个条件将只返回每对中的一个。

答案 2 :(得分:0)

可以通过设置操作完成,例如:

 SELECT parent, child FROM YourTable 
 INTERSECT
 SELECT child, parent FROM YourTable