我有一个 newby sql 相关问题。
假设我有这个简单的表:
A B
------ ------
a b
a c
b a
m n
m o
n m
我想查询只有“对应物”的记录,即我想得到
a b
仅当存在 b a
在表格中,但我想跳过“反向链接”(这里是 b a
)。总结一下,我想得到以下结果
A B
------ ------
a b
m n
这个 sql 查询不起作用,因为在
b a
的情况下正在处理 a b
已从我的结果集中删除。SELECT DISTINCT x1.A, x1.B
FROM TEST x1, TEST x2
WHERE x1.A = x2.B AND x1.B = x2.A -- all records /w counterparts only
AND x1.A NOT IN (SELECT B from TEST where B = x1.A) -- skip the "back links"
WHERE 子句的第二部分无法正常工作。
你有什么提示吗?对此的任何帮助将不胜感激。
问候
彼得
附言我正在使用 Derby 数据库。
最佳答案
您可以将最后一行更改为:
AND x1.A < x1.B
这假设您的列从不自引用(例如:a,a),或者您不希望出现循环引用。如果你这样做,那么:
AND x1.A <= x1.B
编辑:
您最好也使用显式连接:
SELECT DISTINCT
x1.A
, x1.B
FROM
TEST x1
JOIN
TEST x2
ON x1.A = x2.B
AND x1.B = x2.A -- all records /w counterparts only
WHERE x1.A < x1.B --Skip backreference
关于sql选择同一个表中的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13496368/