在Parent上运行查询以仅显示一个子表的记录

时间:2014-09-13 16:02:58

标签: sql postgresql

我有3张桌子,即A,B&角

B& C有A的forign键。

现在我想在A上运行查询,这样只返回B的记录。

也就是说,当我对A的所有记录执行查询时,我想排除C的所有结果并仅显示B的结果。

希望,我的问题是有道理的。

2 个答案:

答案 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是常见的关键。