在SQL中,如何选择所有有孩子的父母?

时间:2013-09-30 00:53:01

标签: sql join query-optimization relational-database

假设我有两个相关的表parentschildren,其中包含一对多关系(一个parent到多个children)。通常当我需要一起处理这些表的信息时,我会进行如下查询(通常添加了WHERE子句):

SELECT * FROM parents INNER JOIN children ON (parents.id = children.parent_id);

如何选择至少有一个parents的所有child而不浪费时间将所有children加入parents

我在考虑使用某种OUTER JOIN,但我不确定该如何处理它。

(请注意,我一般都会问这个问题,所以除非没有通用的解决方案,否则不要给我一个与特定RDBMS实现相关的答案。)

3 个答案:

答案 0 :(得分:2)

我认为避免JOIN的最简单的解决方案是:

SELECT * FROM parents WHERE id IN (SELECT parent_id FROM children);

答案 1 :(得分:2)

正如我之前在评论中提到的那样:

LEFT JOINGROUP 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