Обычный вопрос в случае применения внешних соединений - в каком элементе запроса, 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 приводит к исключению всех внешних строк из результирующего набора, сводя на нет внешнее соединение.
Читайте также: D. Возможности клинического применения вегетативного индекса Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|