#sql
#sql
Вопрос:
В чем разница между этими SQLL:
SELECT *
FROM COURS NATURAL JOIN COMPOSITIONCOURS NATURAL JOIN PARCOURS;
SELECT *
FROM COURS NATURAL JOIN (COMPOSITIONCOURS C JOIN PARCOURS P ON C.IDPARCOURS = P.IDPARCOURS) ;
SELECT *
FROM (COURS NATURAL JOIN COMPOSITIONCOURS C) JOIN PARCOURS P ON C.IDPARCOURS = P.IDPARCOURS ;
У них разные результаты.
Комментарии:
1. Пожалуйста, предоставьте примеры наборов результатов.
Ответ №1:
Трудно точно сказать без примерного набора результатов, но я бы предположил, что вы используете естественные соединения, что обычно является плохой практикой. Причины:
Я бы не стал использовать естественные соединения, потому что естественные соединения:
- Не стандартный SQL.
- Не информативно. Вы не указываете, какие столбцы объединяются, не ссылаясь на схему.
- Ваши условия уязвимы для изменений схемы. Если имеется несколько столбцов естественного соединения и один такой столбец удален из таблицы, запрос все равно будет выполнен, но, вероятно, некорректно, и это изменение в поведении будет беззвучным.
Комментарии:
1. Не стандартно? Действительно?
2.
NATURAL JOIN
определено в стандарте SQL и, следовательно, является «стандартным SQL»
Ответ №2:
Спасибо за все ваши ответы! Я, наконец, выяснил, что проблема связана с использованием естественного соединения. При использовании естественного соединения он будет соединять каждый столбец с тем же именем! Когда я использую ЕСТЕСТВЕННОЕ соединение несколько раз, возможно, что те столбцы, которые имеют одинаковые имена, но вы не хотите объединять, могут быть объединены автоматически! Вот пример, таблица a (IDa, имя, год, IDb) Таблица b (IDb, bonjour, salute, IDc) Таблица c (IDc, год, merci) Если бы я написал, например, из естественного соединения b с естественным c, потому что IDb и IDc являются общими именами для таблиц a, b, c. Кажется, все в порядке! Но внимание, пожалуйста! a.year и b.year также могут быть объединены! Это то, чего мы не хотим!