我有两张桌子。 我们称之为table_A和table_B。
Table_B包含table_A的ForeignKey。
SELECT a.name
FROM table_a a, table_b b
WHERE a.id != b.table_a_fk
现在我想从table_a中获取所有名称,因为IF table_b不包含table_a中记录的ID。
我已经尝试过这个问题:
$.proxy
通过此查询,我得到了正确的结果,我只得到了5次这样的结果,我不知道为什么。
希望有人能解释一下。
答案 0 :(得分:1)
使用distinct
SELECT distinct a.name
FROM table_a a, table_b b
WHERE a.id != b.table_a_fk
或更好的是......
Select distinct name
from tableA a
Where not exists (Select * from tableB
Where table_a_fk = a.id)
答案 1 :(得分:1)
您的查询会在两个表A
和B
之间创建cartesian product。笛卡尔积是生成这些重复值的产品。相反,您希望使用anti-join,这通常使用NOT EXISTS
SELECT a.name
FROM table_a a
WHERE NOT EXISTS (
SELECT *
FROM table_b b
WHERE a.id = b.table_a_fk
)
使用NOT IN
(only if table_b.table_a_fk
is NOT NULL
)表达反联接的另一种方式:
SELECT a.name
FROM table_a a
WHERE a.id NOT IN (
SELECT b.table_a_fk
FROM table_b b
)
表达反连接的另一种不太常见的方式:
SELECT a.name
FROM table_a a
LEFT OUTER JOIN table_b b ON a.id = b.table_a_fk
WHERE b.id IS NULL