如何过滤相反的重复项
How to filter opposite duplicates
有一个 table 包含以下列:
ID Parent Child
1 A B
2 B A
3 C D
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
...
在组合 parent 和 child 或 child 和 parent 时将重复的每个条目不应成为结果的一部分。
更多信息:列表示 table 之间的关系。因此,如果存在从 parent 到 child 的关系,我不需要具有从 child 到 parent.
的关系的另一个条目
我自己的结论是这个问题不能只用 SQL-Statement 解决,需要一个循环,但我希望有人能更好地教我。
提前致谢!
更新:
我的最小示例没有考虑到每列中的值并不像我写的那么简单。它们是通过 (replace(newid(),'-','') 生成的,并且是 guid 的 afaik。所以,我不确定是否可以将它们与 <,>,= 等常用运算符进行比较,如果是最新的newid() 真的 > 以前的 newid()?
还有另一种方法可以解决这个问题吗?
实际上 table 看起来像这样:
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
你可以很容易地做到这一点:
SELECT * FROM YourTable t
WHERE t.Parent > t.Child
其工作原理如下:在每对中(除非它们可以完全相同,我对此表示怀疑)其中一个必须比另一个大,因此 - 这种情况将 return 每对中只有一个。
可以通过集合运算来完成,例如:
SELECT parent, child FROM YourTable
INTERSECT
SELECT child, parent FROM YourTable
有一个 table 包含以下列:
ID Parent Child 1 A B 2 B A 3 C D 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 ...
在组合 parent 和 child 或 child 和 parent 时将重复的每个条目不应成为结果的一部分。
更多信息:列表示 table 之间的关系。因此,如果存在从 parent 到 child 的关系,我不需要具有从 child 到 parent.
的关系的另一个条目我自己的结论是这个问题不能只用 SQL-Statement 解决,需要一个循环,但我希望有人能更好地教我。 提前致谢!
更新: 我的最小示例没有考虑到每列中的值并不像我写的那么简单。它们是通过 (replace(newid(),'-','') 生成的,并且是 guid 的 afaik。所以,我不确定是否可以将它们与 <,>,= 等常用运算符进行比较,如果是最新的newid() 真的 > 以前的 newid()? 还有另一种方法可以解决这个问题吗? 实际上 table 看起来像这样:
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
你可以很容易地做到这一点:
SELECT * FROM YourTable t
WHERE t.Parent > t.Child
其工作原理如下:在每对中(除非它们可以完全相同,我对此表示怀疑)其中一个必须比另一个大,因此 - 这种情况将 return 每对中只有一个。
可以通过集合运算来完成,例如:
SELECT parent, child FROM YourTable
INTERSECT
SELECT child, parent FROM YourTable