假设我有两个相关的表parents
和children
,其中包含一对多关系(一个parent
到多个children
)。通常当我需要一起处理这些表的信息时,我会进行如下查询(通常添加了WHERE
子句):
SELECT * FROM parents INNER JOIN children ON (parents.id = children.parent_id);
如何选择至少有一个parents
的所有child
而不浪费时间将所有children
加入parents
?
我在考虑使用某种OUTER JOIN
,但我不确定该如何处理它。
(请注意,我一般都会问这个问题,所以除非没有通用的解决方案,否则不要给我一个与特定RDBMS实现相关的答案。)
答案 0 :(得分:2)
我认为避免JOIN
的最简单的解决方案是:
SELECT * FROM parents WHERE id IN (SELECT parent_id FROM children);
答案 1 :(得分:2)
正如我之前在评论中提到的那样:
LEFT JOIN
和GROUP BY
的解决方案:
SELECT p.parents.id FROM parents p
LEFT JOIN children c ON (p.parents.id = c.children.parent_id)
WHERE children.parent_id IS NOT NULL
GROUP BY p.parents_id
与DISTINCT
相同:
SELECT DISTINCT p.parents.id FROM parents p
LEFT JOIN children c ON (p.parents.id = c.children.parent_id)
WHERE children.parent_id IS NOT NULL
它应该适用于大多数SQL方言,但在分配as
时某些方法需要table aliases
。
以上未测试。希望我没有写错字。
答案 2 :(得分:0)
试试这个
select parent_id,(select count(1) from children where parent_id = x.parent_id)
from parent x where
(select count(1) from children where parent_id = x.parent_id) > 0