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
给了一个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