Не получается с одной таблицей провернуть сложные запросы

Pasha-1990

Объясните запрос в этом примере)Не получается с одной таблицей провернуть сложные запросы.Вся модель состоит из одной таблицы Личность. В таблице Личность содержится ФИО некоторого человека и ссылки, представляющие из себя родственные связи:  id_person_father – ссылка на отца  id_person_mother – ссылка на мать  id_person_spouse – ссылка на супругу/супругаСсылки представляют собой идентификаторы первичного ключа в таблице Личность, т.е. одна таблица содержит и самого человека, и его детей и его внуков и так далее.Подобная схема предполагает, что у человека может быть ноль или один супруг (иными словами, супруг может быть, а может не быть), также ноль или один отец и ноль или одна мать. С другой стороны, у человека может быть ноль или больше детей (иными словами детей может быть сколько угодно ).Задача.Вывести информацию обо всех дедушках и бабушках и количестве их внуков. Формат результата: ФИО личности, Количество внуков. Представление для проверки: task_11
5 ответов

Pasha-1990

Как вариант, из таблицы делаем три - внуки, родители и бабушки(дедушки). Соединяем через мам или пап. После чего группируем.
SELECT gp.FIO, COUNT(*)
FROM
  PERSON ch,
  PERSON par,
  PERSON gp
WHERE (ch.ID_PERSON_FATHER = par.ID_PERSON
       OR CH.ID_PERSON_MOTHER     = par.ID_PERSON)
AND (par.ID_PERSON_FATHER  = gp.ID_PERSON
     OR par.ID_PERSON_MOTHER    = gp.ID_PERSON)
GROUP BY gp.FIO


Pasha-1990

А можно поподробней объяснить?)от равенство,что означает?Ну по-простому,если объяснять?


Pasha-1990

Сформулируйте корректно вопрос, приведите часть запроса, которая непонятна.


Pasha-1990

WHERE (ch.ID_PERSON_FATHER = par.ID_PERSON
       OR CH.ID_PERSON_MOTHER     = par.ID_PERSON)
AND (par.ID_PERSON_FATHER  = gp.ID_PERSON
     OR par.ID_PERSON_MOTHER    = gp.ID_PERSON)
Вот равенства. Как их понять,то есть,для чего приравниваем.


Pasha-1990

Равенства, как вы говорите, называются условиями связывания таблиц в запросе. Мы связываем таблицы попарно. Первая (PERSON ch) - это дети, вторая (PERSON par) - это их родители. После связывания через
(ch.ID_PERSON_FATHER = par.ID_PERSON OR CH.ID_PERSON_MOTHER = par.ID_PERSON)
в результирующий набор попадут те, у которых есть мама или папа. Третья таблица (PERSON gp) - это бабушки и дедушки. После связывания ее с PERSON par через
(par.ID_PERSON_FATHER = gp.ID_PERSON OR par.ID_PERSON_MOTHER = gp.ID_PERSON)
в результирующий набор попадут только те у кого есть мама или папа, а также у этих мам или пап есть в свою очередь мама или папа ( т.е. дедушки или бабушки людей из первой таблицы. Если у сын есть папа и мама, то после соединения будет две строки: сын-папа сын-мама Если у папы и мамы тоже есть и папа и мама, то будет 4 строки сын-папа-дедушка1 сын-папа-бабушка1 сын-мама-дедушка2 сын-мама-бабушка2 Поскольку условия связывания таблиц идут через AND, то результат попадут только цепочки из трех звеньев.