Sql 如何筛选相反的重复项
有一个包含以下列的表: ID Parent Child 1 A B 2 B A 3 C D 4 E F 5 D C ... ID父/子 1 A B 2 B A 三维 4 E F 5 D C ... 如果列Parent+Child与列Child+Parent相同,如何获取一次条目 例如,ID为1和2的条目在组合上述列时是相同的。所以结果应该是一个条目,ID为1或2的条目 因此,结果集应如下所示: ID Parent Child 1 A B 3 C D 4 E F ... ID Parent Child 6C57C330EB5A4DF8BC245A245569A97C FF42FB32F3FC463EA3366FAB7425E706 7FEF3100E5F149EFB27967F0BE95FFC8 9AD0035D04FA4695AE7854F4BE29FF60 7FEF3100E5F149EFB27967F0BE95FFC8 FF42FB32F3FC463EA3366FAB7425E706Sql 如何筛选相反的重复项,sql,duplicates,multiple-columns,Sql,Duplicates,Multiple Columns,有一个包含以下列的表: ID Parent Child 1 A B 2 B A 3 C D 4 E F 5 D C ... ID父/子 1 A B 2 B A 三维 4 E F 5 D C ... 如果列Parent+Child与列Child+Parent相同,如何获取一次条目 例如,ID为1和2的条目在组合上述列时是相同的。所以结果应该是一个条目,ID为1或2的条目 因此,结果集应如下所示: ID Parent Child 1 A
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
ID父/子
1 A B
三维
4 E F
...
在合并父项和子项或子项和父项时将重复的每个条目不应成为结果的一部分
进一步信息:这些列表示表之间的关系。因此,如果父对象与子对象之间存在关系,我不需要另一个具有子对象与父对象之间关系的条目
我自己的结论是,这个问题不能用SQL语句来解决,需要一个循环,但我希望有人能教我更好。
提前谢谢
更新:
我的最小例子没有考虑到每个列中的值不像我写的那么简单。它们是通过(replace(newid(),'-','')生成的,并且是guid的afaik。因此,我不确定是否可以将它们与常用的运算符进行比较,例如,=以及最新的newid()是否真的>以前的newid()?
还有别的办法解决这个问题吗?
在实际中,该表如下所示:
ID Parent Child
1 A B
3 C D
4 E F
...
ID Parent Child
6C57C330EB5A4DF8BC245A245569A97C FF42FB32F3FC463EA3366FAB7425E706 7FEF3100E5F149EFB27967F0BE95FFC8
9AD0035D04FA4695AE7854F4BE29FF60 7FEF3100E5F149EFB27967F0BE95FFC8 FF42FB32F3FC463EA3366FAB7425E706
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
ID父/子
6C57C330EB5A4DF8BC245A245569A97C FF42FB32F3FC463EA3366FAB7425E706 7FEF3100E5F149EFB27967F0BE95FFC8
9AD0035D04FA4695AE7854F4BE29FF60 7FEF3100E5F149EFB27967F0BE95FFC8 FF42FB32F3FC463EA3366FAB7425E706
谢谢!您可以使用如下查询: ID Parent Child 1 A B 3 C D 4 E F ... ID Parent Child 6C57C330EB5A4DF8BC245A245569A97C FF42FB32F3FC463EA3366FAB7425E706 7FEF3100E5F149EFB27967F0BE95FFC8 9AD0035D04FA4695AE7854F4BE29FF60 7FEF3100E5F149EFB27967F0BE95FFC8 FF42FB32F3FC463EA3366FAB7425E706
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
选择最小值(ID),
当父级<子级然后父级ELSE子级结束时,
当父级>=子级然后父级ELSE子级结束时的情况
从mytable
当父级<子级,然后父级ELSE子级结束时,按情况分组,
当父级>=子级然后父级ELSE子级结束时的情况
您可以轻松实现以下目标:
SELECT * FROM YourTable t
WHERE t.Parent > t.Child
其工作原理如下:在每一对中(除非它们可以完全相同,我对此表示怀疑),其中一个必须比另一个大,因此-此条件将只返回每对中的一个。可以通过设置操作来完成,例如:
SELECT parent, child FROM YourTable
INTERSECT
SELECT child, parent FROM YourTable
感谢您的回复。但不幸的是,这并不是那么容易。结果只留下ID为4的行(见上文)。对不起,我现在已将其更改为十字路口