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

Оператор для наборов данных INTERSECT

Оператор INTERSECT извлекает идентичные строки из результирующих наборов одного или нескольких запросов. В некотором отношении оператор INTERSECT очень напоминает INNER JOIN.

INTERSECT относится к классу операторов для работы с наборами данных (set operator). К другим таким операторам относятся EXCEPT и UNION. Все операторы для наборов данных используются для одновременного манипулирования результирующими наборами двух и более запросов, отсюда и их название.


Синтаксис SQL2003

Технических ограничений на количество запросов в операторе INTERSECT не существует. Общий синтаксис следующий.

INTERSECT [ALL | DISTINCT]

[CORRESPONDING [BY (столбец!, столбец2, …)]] < инструкцияl_SELECT_2> INTERSECT [ALL | DISTINCT]

[CORRESPONDING [BY (столбец!, столбец2, …)]]


Ключевые слова

ALL

Включаются дублирующиеся строки из всех результирующих наборов.

DISTINCT

Дублирующиеся строки удаляются из всех результирующих наборов перед сравнением, проводимым оператором INTERSECT. Столбцы с пустыми (NULL) значениями считаются дублирующимися. Если не указано ни ключевое слово ALL, ни DISTINCT, то по умолчанию подразумевается DISTINCT.

CORRESPONDING

Указывается, что возвращаться будут только те столбцы, которые имеют в обоих запросах одно имя, даже если в обоих запросах используется обобщающий символ (*).

BY

Указывается, что возвращаться будут только названные столбцы, даже если запросы обнаруживают другие столбцы с соответствующими именами. Это предложение должно использоваться вместе с ключевым словом CORRESPONDING.


Общие правила

Есть только одно важное правило, которое необходимо помнить при работе с оператором INTERSECT.

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

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


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

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

Согласно стандарту ANSI оператор INTERSECT имеет более высокий приоритет по сравнению с другими операторами для работы с наборами, хотя на разных платформах приоритет таких операторов обрабатывается по-разному. Вы можете явным образом управлять приоритетом операторов, используя скобки. В противном случае СУБД может выполнять их в порядке слева направо или от первого к последнему.

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

На платформах, которые не поддерживают оператор INTERSECT, вы можете заменить его подзапросом FULL JOIN.

SELECT
a.au_lname AS ‘lastname’,
a.au_fname AS ‘firstname’
FROM authors AS a
INTERSECT
SELECT
e.emp_lname AS ‘lastname’,
e.emp_fname AS ‘firstname’
FROM employees AS e
ORDER BY lastname, firstname;

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

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


DB2

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

{инструкция._SELECT_7 | VALUES (выраж7 [, …])} INTERSECT [ALL]

[CORRESPONDING [BY {столбец!, столбец2, …)]] {инструкция_SCJ_2 | VALUES {выраж2 [, …])} INTERSECT [ALL]

[CORRESPONDING [BY (столбец!, столбец2. …)]]

Хотя инструкция INTERSECT DISTINCT не поддерживается, функциональным эквивалентом является INTERSECT. Предложение CORRESPONDING не поддерживается.

Кроме того, типы данных LONG VARCHAR, LONG VARGRAPHIC, BLOB, CLOB, DBCLOB, DATALINK и структурные типы не применяются в предложении INTERSECT, но их можно использовать в предложении INTERSECT ALL.

Если в результирующем наборе данных есть столбец, имеющий одно и то же имя во всех инструкциях SELECT, то это имя используется в качестве окончательного имени для столбца, возвращаемого инструкцией. Если же в запросах для столбца используются разные имена, то платформа DB2 сгенерирует для результирующего столбца новое имя. После этого становится непригодным для использования в предложениях ORDER BY и FOR UPDATE.

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

SELECT
empno
FROM employee
WHERE workdept LIKE ‘E%’
INTERSECT (
SELECT empno
FROM emp_act
WHERE projno IN (‘IF1000’, ‘IF2000’, ‘AD3110’)
UNION
VALUES
(‘AA0001’),
(‘AB0002’),
(‘AC0003’)
)

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


MySQL

Не поддерживается.

Источник