понимание логики И и ГДЕ в т-sql - PullRequest
0 голосов
/ 02 мая 2018

Я работаю над Transact-SQL, Microsoft Azure. Я пытаюсь понять, почему в некоторых запросах на объединение WHERE и AND оба могут использоваться и давать один и тот же результат (или, по крайней мере, в моей базе данных это выглядит как один и тот же результат), а в других запросах where hasn ' т работает и делает.

Здесь я объединяю 2 таблицы:

select c.customerID, ca.addressID, ca.addressType
from salesLT.customer as c
join salesLT.customerADdress as ca
on c.customerID = ca.customerID
WHERE ca.addressType = 'Main Office';  --WHERE or AND works the same

Это дает мне то, что я искал = только строки из таблицы customerAddress, где типом является «Главный офис». Изменение слова WHERE на AND дает точно такой же результат.

Теперь запрос основан на предыдущем, но я пытаюсь объединить 3 таблицы. Здесь WHERE не работает, и я должен поставить AND:

select c.customerId, c.companyName, ca.addressID, ca.addressType, a.addressLine1, a. city
from salesLT.customer as c
join salesLT.customerAddress as ca
on c.customerID = ca.customerID
WHERE ca.addressType = 'Main Office' -- error: incorrect syntax near 'join'
join salesLT.address as a
on ca.addressId = a.addressID; 

Если я изменю WHERE на AND, это сработает. Зачем? В чем разница между объединением 2 таблиц и 3? Спасибо

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Если я изменю WHERE на AND, это будет работать. Почему?

Поскольку использование and добавляет условие к предложению on, но использование where является новым предложением.

Вот полное объяснение: Основной синтаксис оператора select при использовании нескольких объединений:

SELECT <columns>
FROM <table 1>
JOIN <table 2> ON <condition>
JOIN <table 3> ON <condition>
WHERE <condition>

Это означает, что ваш второй запрос должен выглядеть следующим образом:

select c.customerId, c.companyName, ca.addressID, ca.addressType, a.addressLine1, a.city
from salesLT.customer as c
join salesLT.customerAddress as ca on c.customerID = ca.customerID
join salesLT.address as a on ca.addressId = a.addressID
WHERE ca.addressType = 'Main Office';

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

0 голосов
/ 02 мая 2018

Второй JOIN должен быть перед предложением WHERE

select c.customerId, c.companyName, ca.addressID, ca.addressType, a.addressLine1, a. city
from salesLT.customer as c
join salesLT.customerAddress as ca
on c.customerID = ca.customerID
join salesLT.address as a
on ca.addressId = a.addressID
WHERE ca.addressType = 'Main Office' 
;
...