В чем разница между InnerJoin в таблице и включением ее в предложение FROM? - PullRequest
1 голос
/ 06 декабря 2010

Какая разница между двумя приведенными ниже операторами SQL (один использует INNER JOIN, а второй - предложение from) (Производительность, время выполнения ..),
и есть ли случаи, когда ядолжен использовать один вместо другого?

SELECT Tbl1_Fld1, Tbl2_Fld1 FROM DB1..TABLE1 
INNER JOIN DB2..TABLE1 
on DB1..TABLE1 .Tbl1_Fld1 = DB2..TABLE1.Tbl2_Fld1

SELECT Tbl1_Fld1, Tbl2_Fld1 FROM DB1..TABLE1,DB2..TABLE1 
WHERE DB1..TABLE1 .Tbl1_Fld1 = DB2..TABLE1.Tbl2_Fld1

Ответы [ 4 ]

4 голосов
/ 06 декабря 2010

В идеальном мире они должны быть эквивалентны, за исключением того, что первый лучше документирует, чего вы хотите достичь (объедините две таблицы и затем найдите результат).

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

Некоторые базы данных просто не поддерживают INNER JOIN, хотя это стандартный синтаксис SQL.

Другие содержат ошибки для определенных типов данных, поэтому объединение не будет работать или будет очень медленным.

Таким образом, в действительности вам придется запустить их с подходящими тестовыми данными , чтобы выяснить это. Невозможно сказать наверняка, просто взглянув на SQL. Иногда даже нет способа точно сказать, когда вы можете запустить его, потому что изменения в базовых данных могут оказать огромное влияние (например, Oracle может внезапно принять решение игнорировать индекс, потому что слишком много строк в таблице было измененная).

3 голосов
/ 06 декабря 2010

Используйте INNER JOIN, если ваш движок его поддерживает, в основном для ясности условия соединения и разделения фильтров

SELECT Tbl1_Fld1, Tbl2_Fld1
FROM
    DB1..TABLE1,DB2..TABLE1 
WHERE
    DB1..TABLE1 .Tbl1_Fld1 = DB2..TABLE1.Tbl2_Fld1 AND
    DB1..TABLE1 .Tbl1_Fld1 = 'foo' AND DB2..TABLE1.Tbl2_Fld1 = 1

против

SELECT Tbl1_Fld1, Tbl2_Fld1
FROM
   DB1..TABLE1 
   INNER JOIN
   DB2..TABLE1 ON DB1..TABLE1 .Tbl1_Fld1 = DB2..TABLE1.Tbl2_Fld1
WHERE 
   DB1..TABLE1 .Tbl1_Fld1 = 'foo' AND DB2..TABLE1.Tbl2_Fld1 = 1

В большинстве двигателей не должно быть различий в исполнении

Однако, и всегда есть «однако», не все объединения являются ВНУТРЕННИМИ.А как насчет ВНЕШНЕГО соединения?Например, *= и =* устарели в SQL Server.

Это было в Книгах онлайн в SQL Server 2000. Вот цитата

В более ранних версиях Microsoft® SQL Server ™ 2000, условия левого и правого внешнего соединения были указаны в предложении WHERE с использованием операторов *= и =*.В некоторых случаях этот синтаксис приводит к неоднозначному запросу, который можно интерпретировать более чем одним способом.Совместимые с SQL-92 внешние объединения указываются в предложении FROM и не приводят к этой неоднозначности.Поскольку синтаксис SQL-92 является более точным, подробные сведения об использовании старого синтаксиса внешнего объединения Transact-SQL в предложении WHERE не включены в этот выпуск.Синтаксис может не поддерживаться в будущей версии SQL Server.Любые операторы, использующие внешние объединения Transact-SQL, должны быть изменены для использования синтаксиса SQL-92.

Так что если у вас есть более сложный запрос с внутренним и внешним объединениями, это может привести к путаницеВы смешиваете стили.Итак, добавьте консистенцию к ясности , упомянутой выше

3 голосов
/ 06 декабря 2010

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

1 голос
/ 06 декабря 2010

Не следует писать новые запросы, используя синтаксис «От» (действительно называемый неявным объединением).И лично я переписал бы любой, с которым я столкнулся, потому что это просто плохая практика кодирования.

Этот синтаксис очень подвержен ошибкам из-за случайного перекрестного соединения, и его сложнее поддерживать и труднее правильно читать.Если вам нужно добавить левое объединение позже, вы можете получить неправильные результаты, если не конвертируете в явные объединения.Иногда требуется перекрестное объединение, но с неявным синтаксисом вы не знаете, было ли перекрестное объединение ошибочным (распространенным с использованием этого синтаксиса) или преднамеренным, поэтому сопровождающий не знает, менять его или нет.Он был заменен в 1992 году ради бога.Нет оправдания тому, что в 2010 году не использовался явный синтаксис объединения.

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