2013-10-08 3 views
0

У меня есть структура таблицы, которая, упрощенная, выглядит примерно так.Как подсчитать несколько отношений в SQL

grandparents 
    id 
    name 
parents 
    id 
    grandparent_id 
    name 
children 
    id 
    parent_id 
    name 

Я знаю, что могу рассчитывать число детей, один из родителей имеет так:

select 
    name, 
    (select count (*) from children c where c.parent_id = p.id) as count 
    from p parents; 

Мой вопрос, как я могу подсчитать количество детей, которые связаны с прародителя. Структура таблицы не может быть изменена, и мне нужен один оператор SELECT. Это возможно?

Заранее спасибо.

ответ

2

Это должно сделать трюк, даже в странных родословных (родители, являющихся братьями, например):

SELECT gp.id, 
     gp.name, 
     COUNT(DISTINCT c.id) 
FROM grandparents gp 
     INNER JOIN parents p 
       ON p.grandparent_id = gp.id 
     INNER JOIN children c 
       ON c.parent_id = p.id 
GROUP BY gp.id, 
      gp.name 

См fiddle (нет Firebird двигатель доступен, но этот код является стандартным SQL-совместимый).

+1

спасибо, человек. я действительно должен научиться работать с командой JOIN – lordvlad

+0

oh wait, где я могу проверить конкретный gp.id сейчас? добавить предложение where в конце? или непосредственно перед первым внутренним соединением? – lordvlad

+1

Вы добавляете его перед предложением GROUP BY. –

Смежные вопросы