использование круглых скобок в SQL

#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 также могут быть объединены! Это то, чего мы не хотим!