SQL 以任意顺序匹配记录

SQL Match records in any order

给了一个table赞

OBJECTID,UID,FID1,FID2
1,Record1,00000494e1f3,00000494e1f3
2,Record2,00000494e1ed,00000494e1ed
3,Record3,eff9df49d9ec,6d1f58545043
4,Record4,6d1f58545043,eff9df49d9ec
5,Record5,37fce22b2bb5,7fce22b2bb5
6,Record6,00000494e1ef,00000494e1ef

我们可以看到记录3和4中的FID1和FID2值相同,只是顺序不同。

我可以简单地连接 FID1 和 FID2 值,然后 运行 在该列上是唯一的,但这不会给我们提供 FID1/2 相同但顺序不同的情况。

https://www.db-fiddle.com/f/gp3vYGhB9cgYUukcEwM3K3/1

如何找到 FID1 和 FID2 值相同但顺序不同的所有记录?

这样做:将table连接到自身,并过滤掉您感兴趣的行(FID相同但顺序不同,并且行不是同一行):

SELECT t1.*
FROM Test t1
JOIN Test t2
  ON t1.OBJECTID != t2.OBJECTID
  AND t1.r_FID1 = t2.r_FID2
  AND t2.r_FID1 = t1.r_FID2;

如果您只想要重复的行之一,您可以例如select FID1 大于 FID2 的那个(另一行显然会颠倒过来):

SELECT t1.*
FROM Test t1
JOIN Test t2
  ON t1.OBJECTID != t2.OBJECTID
  AND t1.r_FID1 = t2.r_FID2
  AND t2.r_FID1 = t1.r_FID2
  AND t1.r_FID1 > t1.r_FID2;

PS:感谢您的fiddle!

在select中使用IF和CONCAT也能帮到你

SELECT hash
FROM(
select 
*, IF(r_FID1 > r_FID2, CONCAT(r_FID1,'_', r_FID2), CONCAT(r_FID2,'_', r_FID1)) `hash`
from Test
) t 
GROUP BY hash