Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Обычный вопрос в случае применения внешних соединений - в каком элементе запроса, ON или where, задавать предикат?




 

Отбор, основанный на предикате элемента on, не является окончательным. Другими словами, предикат ON не определяет появление строки в результирующем наборе только при совпадении со строками из другой таблицы.

 

Поэтому если нужно задать неокончательный предикат, т.е. предикат, определяющий, какие строки совпадают со строками несохраняемой таблицы, то его нужно задавать в элементе ON.

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

 

Элемент where обрабатывается после элемента from, а именно после того, как выполнены все табличные операции (внешние соединения) и все внешние строки уже добавлены. Кроме того, условие where в отличие от элемента on является окончательным для исключаемых строк.

Пример: Первый запрос вернет всех клиентов, кто сделал или не сделал заказы (для не сделавших значение orderid = NULL):

SELECT C.custid, C.companyname, O.orderid

FROM Sales.Customers AS C

LEFT OUTER JOIN Sales.Orders AS O

ON C.custid = O.custid;

 

Этот запрос вернет только клиентов, кто не сделал заказы (для не сделавших, значение orderid = NULL):

SELECT C.custid, C.companyname, O.orderid

FROM Sales.Customers AS C

LEFT OUTER JOIN Sales.Orders AS O

ON C.custid = O.custid

WHERE O.orderid IS NULL;

GO

 

 

 

Пример:

Имеется таблица с последовательными датами (таблица Nums1, поле d):

 

Выбрать даты, в которых выполнялись заказы:

SELECT Nums1.d AS orderdate

FROM Nums1

LEFT OUTER JOIN Sales.Orders AS O

ON Nums1.d = O.orderdate

WHERE O.orderid IS not NULL

ORDER BY orderdate;

 

Выбрать даты, в которых не выполнялись заказы:

SELECT Nums1.d AS orderdate

FROM Nums1

LEFT OUTER JOIN Sales.Orders AS O

ON Nums1.d = O.orderdate

WHERE O.orderid IS NULL

ORDER BY orderdate;

 

Замечание: Если предикат в элементе where ссылается на атрибут из несохраняемой таблицы, участвующей во внешнем соединении, применяя выражение вида <атрибут> <операция> <значение>, как правило, это
логическая ошибка.

Поскольку атрибуты несохраняемой таблицы соединения во внешних строках равны NULL, выражение вида NULL <операция> <значение> дает в результате UNKnown (если для поиска значений null не применяется явно оператор IS null). Элемент where отбрасывает значения unknown. Подобный предикат в элементе where приводит к исключению всех внешних строк из результирующего набора, сводя на нет внешнее соединение.

Поделиться:





Читайте также:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...