Разница между использованием где и и с О в SQL


У меня есть SQL-запрос

SELECT AccountMaster.AccountID, AccountMaster.AccountDesc, Settings.Description      
FROM AccountMaster

INNER JOIN Settings ON AccountMaster.AccountID = Settings.AcID
                    AND  Settings.CompanyID = @CompanyId
                    AND AccountMaster.CompanyID = @CompanyId

Так я думал, я мог бы использовать такой

SELECT AccountMaster.AccountID, AccountMaster.AccountDesc, Settings.Description      
FROM AccountMaster

INNER JOIN Settings ON AccountMaster.AccountID = Settings.AcID
WHERE  Settings.CompanyID = @CompanyId 
       AND AccountMaster.CompanyID = @CompanyId

В чем разница и какой лучше использовать? или это два запроса работают по-разному?



115
-3
задан 16 февраля 2018 в 09:02 Источник Поделиться
Комментарии
1 ответ

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

С точки зрения читабельности, лучше отделить присоединиться и фильтр условиям.

FROM 
AccountMaster
INNER JOIN
Settings ON
--This is a JOIN condition, with no outside restriction (date, id, etc)
AccountMaster.AccountID = Settings.AcID
WHERE
--these are filters, independent of the join
Settings.CompanyID = @CompanyId
AND
AccountMaster.CompanyID = @CompanyId

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

Еще один момент, когда вы читаете это, разделение имеет смысл


Дайте мне строки из AccountMaster и таблица настроек, где они совпадают
на accountid и кислоты. Затем фильтр с CompanyId

Теперь, вы можете подумать: "если я фильтр сначала это будет быстрее".Может быть, это будет, но это работа оптимизатора запросов.

SQL-это декларативный: то есть, вы говорите, что вы хотите, но не как это сделать. Движок базы данных (с помощью оптимизатора) будет работать, лучший способ сделать это, но честь вашего намерения.

По логике, порядок обработки

1. FROM
2. ON
3. JOIN
4. WHERE
5. GROUP BY
6. WITH CUBE/ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10. ORDER BY
11. TOP
12. OFFSET/FETCH

Но оптимизатор может фильтр первый (где), но будет поддерживать логический порядок.

0
ответ дан 16 февраля 2018 в 09:02 Источник Поделиться