如何编写显示没有子项的祖父母的SQL查询(两个子表)?

时间:2017-05-16 20:52:09

标签: sql postgresql

我想写一个查询,返回所有没有孙子的祖父母。这是我的表结构:

**Grandparents**
id    name
1     lewis

**Parents**
id    name    grandparent_id
10    bob     1    
11    mark    1

**Children**
id    name      parent_id
99    seabass   10

这是我写的查询,但它返回'祖父母',其中一个父母有0个孩子(问题!)。我只想回到所有父母都有0个孩子的祖父母,但我不确定最好的方法。

SELECT grandparents.*
FROM grandparents
LEFT OUTER JOIN parents ON parents.grandparent_id = grandparents.id
LEFT OUTER JOIN children ON children.parent_id = parents.id
WHERE children.id is null
GROUP BY grandparents.id
HAVING count(children.id) = 0;

此查询返回祖父母'lewis',但我想写一个查询返回:此实例中有0条记录,因为没有没有孙子的祖父母。

PS。祖父母不能单独存在,并且数据中至少有一个父母。

3 个答案:

答案 0 :(得分:2)

你很亲密。您想知道从不任何子项,因此需要在having子句中进行比较:

SELECT gp.*
FROM grandparents gp LEFT OUTER JOIN
     parents p
     ON p.grandparent_id = gp.id LEFT OUTER JOIN
     children c
     ON c.parent_id = p.id
GROUP BY gp.id
HAVING COUNT(c.id) = 0;

您的查询实际上回答了一个稍微不同的问题:有多少祖父母生孩子没有孩子?

答案 1 :(得分:0)

没有孙子和主要查询内部加入GRAND和PARENTS(因为你想知道奶奶和孩子(作为父母))

select distinct g.*
from grandparents g
inner join on parents p
    on g.id = p.grandparent_id
where
   NOT EXISTS (
   select 1 from children c where c.parent_id = p.id
   )

答案 2 :(得分:0)

SELECT gra.*, par.*, chi.*, count(chi.id) AS cnt_children
FROM grandparents AS gra
LEFT JOIN parents AS par ON par.grandparent_id = gra.id
LEFT JOIN children AS chi ON chi.parent_id = par.id
GROUP BY gra.id
HAVING cnt_children = 0;

祖父Lewis(在你的问题中)确实应该没有记录。 有些疑惑我也和两位祖父一起测试过。结果如预期。所以:

1)祖父Lewis有4个孩子,只有2个孙子;
2)祖父Andrew没有孩子,因此没有孙子。

没有孙子孙女的祖父母的结果是:

Grandparents without grandchildren

在这里(探测)祖父母有孙子孙女的结果(只需删除查询中的HAVING子句):

Grandparents with and without grandchildren