Странное SQL соединение - PullRequest
3 голосов
/ 09 мая 2011

Может кто-нибудь объяснить мне, какой синтаксис соответствует этому SQL-запросу?

SELECT DISTINCT boats.boatid
FROM boats LEFT JOIN reservations ON
reservations.boatid = boats.boatid
and (@paramFromDate <= reservations.to AND reservations.from <= @paramToDate )
WHERE reservations.to IS NULL

таблица:

**boats** boatid

**reservations** reservationid, fk_boatid, from, to

Идея запроса состоит в том, чтобы получить незарезервированные лодки для диапазона дат, отмеченного параметрами. Любая лодка, у которой есть какая-либо часть диапазона, покрытая даже частично, недоступна.

Как там этот код "и ..."? Почему в нем отсутствует ключевое слово WHERE? Похоже, где там неявно?

Ответы [ 4 ]

5 голосов
/ 09 мая 2011

Когда вы присоединяетесь, у вас может быть несколько критериев.«И» делает это таким, что вы присоединяетесь только тогда, когда «это» И «это» истинно.Вы также можете переместить это в предложение WHERE, но SQL может оптимизировать его лучше, если оно является частью условия JOIN.Не говоря уже о том, что в этом случае он может дать разные результаты из-за LEFT JOIN.Я не могу сказать, потому что я не уверен, из каких таблиц получены max и minprice.

Короче говоря, это часть условия соединения.

SELECT DISTINCT beverages.beverageid
FROM beverages
LEFT JOIN invoices ON invoices.beverageid = beverages.beverageid AND (100 <= maxprice AND minprice <= 500)
WHERE maxprice IS NULL

(переписал код таклегче читать толково)

1 голос
/ 09 мая 2011

Условие и применяется к объединению.Сначала соединение выполняется в соответствии с условиями, а затем ГДЕ применяется к набору результатов.

Это ничего не должно возвращать, потому что сначала он находит список напитков, максимальная цена которых> = 100, а минимальная цена <= 500, все эти возвращаемые значения будут иметь значение (не нулевое) для maxprice и minprice.Для предложения WHERE не останется нулевых значений, поэтому он вернет пустой набор. </p>

1 голос
/ 09 мая 2011

"and..." является частью вашего условия соединения.

0 голосов
/ 09 мая 2011

Добавляя дополнительные условия к LEFT JOIN, вы фактически указываете SQL Server извлекать все строки из напитков и извлекать строки из счетов-фактур, которые содержат соответствующий напиток, где maxprice больше или равно 100, а minprice равно больше или равно 500 ИЛИ возвращает строку NULL из счетов-фактур, если не существует строк, удовлетворяющих условиям соединения.

В этом случае, поскольку вы делаете SELECT DISTINCT beverage, скорее всего, ЛЕВОЕ СОЕДИНЕНИЕ будет оптимизировано как поверхностное.

Последняя строка WHERE удалит большинство строк из вашего запроса.

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