Галерея
7757 8119 8300 8698 8817 9504 9722 9937
Интересные записи
Топовые новости
Новое

Оператор для наборов данных EXCEPT общие правила

Существует только одно важное правило использования инструкции EXCEPT, которое нужно запомнить.

Порядок, количество и типы данных столбцов должны быть однотипны во всех запросах.

Согласно стандарту ANSI операторы работы с наборами UNION и EXCEPT имеют одинаковый приоритет, однако оператор INTERSECT выполняется перед другими операторами для наборов. Мы рекомендуем явным образом управлять приоритетом операторов, используя скобки. Это вообще является очень хорошей практикой.

Согласно стандарту ANSI в запросе можно использовать только одно предложение ORDER BY. Вставляйте его в самый конец последней инструкции SELECT. Чтобы избежать двусмысленности в указании столбцов и таблиц, обязательно присваивайте один и тот же псевдоним всем соответствующим друг другу столбцам таблиц. Например:

SELECT
au_lname AS ‘lastname’,
au_fname AS ‘firstname’
FROM authors
EXCEPT
SELECT
emp_lname AS ‘lastname’,
emp_fname AS ‘firstname’
FROM employees
ORDER BY lastname, firstname;

Кроме того, поскольку в каждом списке столбцов столбцы могут указываться с соответственно совместимыми типами данных, на разных платформах СУРБД могут встречаться разные варианты работы со столбцами разной длины. Например, если столбец au_lname из первого запроса в предыдущем примере значительно длиннее, чем столбец emp_lname из второго запроса, то разные платформы могут применять разные правила определения длины конечного результата. Но, вообще говоря, платформы будут выбирать для результата более длинный (и менее ограниченный) размер.

Каждая СУРБД может применять свои собственные правила использования имени столбца в том случае, если имена в списках столбцов различаются. В общем случае используются имена столбцов первого запроса.

Типы данных не обязательно должны быть идентичны, но они должны быть совместимы. Например, типы CHAR и VARCHAR совместимы. По умолчанию для результирующего набора в каждом столбце будет использоваться размер, соответствующий самому большому типу в каждом конкретном положении. Например, запрос, извлекающий данные из столбцов, содержащих значения типа VARCHAR(IO) и VARCHAR(15), будет использовать тип и размер VARCHAR(15).


Советы и хитрости программирования

Ни одна из платформ не поддерживает предложение CORRESPONDING [BY (столбец!, столбец2, …).

На платформах, которые не поддерживают оператор EXCEPT, вы можете заменить его подзапросом NOT IN. Однако подзапросы NOT IN по-другому обрабатывают пустые (null) значения и на некоторых платформах создают разные результирующие наборы.


DB2

Платформа DB2 поддерживает ключевые слова EXCEPT и EXCEPT ALL стандарта ANSI плюс дополнительное предложение VALUES.

{SELECT statementl | VALUES (expressionl, expression [, …])} EXCEPT [ALL]

{SELECT statemenr.2 | VALUES (expressionl, expression2 [, …])} EXCEPT [ALL]

Где:

VALUES

Позволяет указывать один или несколько задаваемых вручную столбцов, которые включаются в окончательный результирующий набор. (Это называется конструктором строк.) В предложении VALUES должно быть указано ровно столько столбцов, сколько их указывается в запросах оператора EXCEPT. Хотя инструкция EXCEPT DISTINCT не поддерживается, функциональным эквивалентом является EXCEPT. Предложение CORRESPONDING не поддерживается. Кроме того, типы данных LONG VARCHAR, LONG VARGRAPHIC, BLOB, CLOB, DBCLOB, DATALINK и структурные типы не применяются в предложении EXCEPT, но их можно использовать в предложении EXCEPT ALL.

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

Если в одном запросе используется несколько операторов для работы с наборами данных, то первым выполняется тот, который заключен в скобки. После этого порядок выполнения будет слева направо. Тем не менее все операторы INTERSECT выполняются до операторов UNION и EXCEPT. Например:

SELECT empno
FROM employee
WHERE workdept LIKE ‘E%’ EXCEPT
SELECT empno
FROM emp_act
WHERE projno IN (TF1000′, TF2000′, -AD3110′))
UNION
VALUES
(‘AA0001’),
(‘AB0002’),
(‘AC0003’);

В приведенном выше примере из таблицы employee извлекаются идентификаторы (ID) всех служащих, работающих в департаменте, название которого начинается с «Е», затем из таблицы учетных записей служащих (emp_act) исключаются ID тех, кто занят в проектах IF1000, IF200′ и AD3110. И наконец, добавляется три дополнительных ID — АА0001, AB0002 и AC0003 при помощи оператора работы с наборами UNION.


MySQL

В MySQL оператор EXCEPT не поддерживается. В качестве альтернативы вы можете использовать операции NOT IN или NOT EXISTS.

Источник