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