我有3张桌子,即A,B&角
B& C有A的forign键。
现在我想在A上运行查询,这样只返回B的记录。
也就是说,当我对A的所有记录执行查询时,我想排除C的所有结果并仅显示B的结果。
希望,我的问题是有道理的。
答案 0 :(得分:0)
这是你想要的吗?
select a.*
from a
where exists (select 1 from b where b.aid = a.aid) and
not exists (select 1 from c where c.aid = c.aid);
答案 1 :(得分:0)
如果你想从B返回A的所有记录和任何匹配的记录,那么左外连接是合适的:
SELECT a.*, b.*
FROM a, b
WHERE a.id = b.id
这将返回A
中的每条记录,并填充B
中匹配的值。如果A
中有多个匹配的行,则还会为B
中的记录返回多行。
只是因为C
中有一个引用表A
中的内容的外键,除非您在查询中使用它,否则不会返回。
如果您只想在B
出现外键时从A
返回所有记录,那么您可能想要:
SELECT *
FROM B
WHERE B.id in (SELECT id FROM A)
AND B.id not in (SELECT id FROM C)
或
SELECT *
FROM B
WHERE EXISTS (SELECT 1 FROM A JOIN B on A.id = B.id)
AND NOT EXISTS (SELECT 1 FROM C JOIN B on C.id = B.id)
所有这些都假设id
是常见的关键。