вопрос sql запрос шаг за шагом - PullRequest
0 голосов
/ 15 ноября 2018

Существует 3 отношения:

  • person(id, first_name, original_surname, new_surname, birth_date)
  • marriage(m_id, w_id, date)
  • child_of(child_id, father_id, mother_id)

и запросдля половины братьев и сестер это:

(
  select P1.id, P2.id
  from (
    person join child_of on id=child_id
  ) as P1
    natural join (person join child_of on id=child_id) as P2
         using (father_id)
  where P1.mother_id < P2.mother_id
)
union
(
   select P1.id, P2.id
   from (
     person join child_of on id=child_id
   ) as P1
     natural join (person join child_of on id=child_id) as P2
             using (mother_id)
   where P1.father_id < P2.father_id
 )

Я новичок в SQL и пытаюсь понять, что происходит "за кулисами".Какая таблица создается в конце, и как запрос находит половинных братьев и сестер.

Создается ли P1, затем он соединяется с P2, а затем они оба объединяются, и как where влияет на таблицу?

Каков здесь хронологический порядок вещей, что происходит первым, вторым ...

1 Ответ

0 голосов
/ 15 ноября 2018

Обработка здесь не пойдет дальше шага парсера, который обнаружит синтаксическую ошибку в запросе. Природные объединения (которых лучше избегать) не содержат условия USING.

Но при условии, что вы имеете в виду INNER вместо NATURAL, ответ во многом зависит от количества и распределения данных в таблицах, а также от конфигурации базы данных.

Также на ответ влияют индексы в таблицах.

Существует много разных способов выполнить такой запрос, и механизм базы данных автоматически выберет тот, который он считает наиболее быстрым в данных обстоятельствах.

Вы можете использовать команду EXPLAIN, чтобы увидеть, какой план выполнения выбирает PostgreSQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...