2014-09-13 52 views
0

我有3个表格,即A,B & c。在Parent上运行查询以显示只有一个子表的记录

乙& C有A.

现在我想运行上的一个查询,以这样的方式的关键forign,只返回B的记录。

也就是说,我要排除所有C的结果,并显示B的结果仅,当A.

希望的所有记录执行查询时,我有这个问题是有道理的。

+0

只需将您想要查看的属性放在select中即可。例如,'SELECT B.foo,B.bar FROM A JOIN B ON B.A_id = A.id JOIN C ON C.A_id = A.id WHERE ...' – lurker 2014-09-13 16:19:04

回答

0

如果你想返回从B,则东西左外连接A的所有记录和任何匹配的记录是适当的:

SELECT a.*, b.* 
FROM a, b 
WHERE a.id = b.id 

这会从A返回每条记录,然后从B填充值哪里有一场比赛。如果B中有多个匹配的行,这也将返回多行记录发生在A中的记录。

仅仅因为在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是关键,其常见。

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); 
相关问题