Таблицы Oracle JOIN 3 - какой путь эффективен или есть какая-то разница? - PullRequest
3 голосов
/ 04 февраля 2011

Я вижу, как люди делают соединения по-разному

выберите a.acc, b.acc, c.acc из a, b, c где a.acc = b.acc и c.acc = a.acc;

и

выберите a.acc, b.acc, c.acc a.acc = b.acc ПРИСОЕДИНЯЙТЕСЬ к c.acc = a.acc;

Есть ли разница? Я полагаю, нет.

Ответы [ 3 ]

7 голосов
/ 04 февраля 2011

В дополнение к замечанию Марка о том, что использование последнего синтаксиса помогает избежать непреднамеренного пропуска условия объединения, одна приятная вещь в синтаксисе SQL 99 состоит в том, что если ваше соглашение об именовании столбцов заключается в том, что имя столбца в соответствия родительской и дочерней таблиц, вы можете использовать предложение USING, а не предложение ON, то есть

SELECT <<list of columns>>
  FROM a JOIN b USING( acc )
         JOIN c USING( acc )

Это может улучшить читаемость кода и снизить вероятность того, что вы введете ошибки, непреднамеренно присоединившись к таблицам. Если бы у меня был никель каждый раз, я бы случайно написал что-то вроде

SELECT <<list of columns>>
  FROM a,
       a_to_b,
       b
 WHERE a.a_id = a_to_b.a_id
   AND b.b_id = a_to_b.a_id -- a_to_b.**a_id** rather than a_to_b.**b_id**

когда я действительно имел в виду

SELECT <<list of columns>>
  FROM a,
       a_to_b,
       b
 WHERE a.a_id = a_to_b.a_id
   AND b.b_id = a_to_b.b_id

Я бы был богатым человеком. Или, по крайней мере, достаточно для хорошего ужина с суши.

В большинстве случаев, конечно же, сразу становится очевидным, что вы сделали что-то не так, потому что данные полностью ошибочны, но иногда случается, что результаты достаточно близки, что не сразу очевидно, что вы сделали что-то не так и только намного позже вы обнаружите ошибку и отследите преступника. В принципе невозможно совершить такую ​​ошибку, если вы напишите запрос с предложением USING

SELECT <<list of columns>>
  FROM a JOIN a_to_b USING (a_id)
         JOIN b      USING (b_id)
7 голосов
/ 04 февраля 2011

С точки зрения производительности нет никакой разницы.

Я предпочитаю второй подход для удобства обслуживания. Более ясно, какие условия используются для объединения таблиц, и легче увидеть, пропустили ли вы условие объединения или нет.

3 голосов
/ 04 февраля 2011

если ваш второй выбор читать select a.acc, b.acc, c.acc from a JOIN b on a.acc=b.acc JOIN c on c.acc = a.acc;, то нет никакой разницы.

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