Случай использования одной и той же таблицы в подзапросе и внешнем запросе

Выдать номера поставщиков, которые поставляют по крайней мере одну деталь, поставляемую поставщиком S2.

SELECT DISTINCT НОМЕР_ПОСТАВЩИКА

FROM SP

WHERE НОМЕР_ДЕТАЛИ IN

(SELECT НОМЕР_ДЕТАЛИ

FROM SP

WHERE НОМЕР_ПОСТАВЩИКА = 'S2');

Результат:

НОМЕР_ПОСТАВЩИКА
S1 S2 S3 S4

Отметим здесь, что ссылка на SP в подзапросе означает не то же самое, что ссылка на SP во внешнем запросе. В действительности, два имени SP обозначают различные переменные. Чтобы этот факт стал явным, можно использовать псевдонимы:

SELECT DISTINCT SPX. НОМЕР_ПОСТАВЩИКА

FROM SP SPX

WHERE SPX. НОМЕР_ДЕТАЛИ IN

(SELECT SPY. НОМЕР_ДЕТАЛИ

FROM SP SPY

WHERE SPY. НОМЕР_ПОСТАВЩИКА ='S2');

Эквивалентный запрос с использованием соединения имеет вид;

SELECT DISTINCT SPX. НОМЕР_ПОСТАВЩИКА

FROM SP SPX, SP SPY

WHERE SPX. НОМЕР_ДЕТАЛИ = SPY. НОМЕР_ДЕТАЛИ

AND SPY. НОМЕР_ ПОСТАВЩИКА = 'S2';

СЛУЧАЙ, КОГДА В КОРРЕЛИРОВАННОМ И ВНЕШНЕМ ЗАПРОСЕ ИСПОЛЬЗУЕТСЯ ОДНА И ТА ЖЕ ТАБЛИЦА

Выдать номера всех деталей, поставляемых более чем одним поставщиком. (Другое решение этой задачи дается позднее в примере 5.4.9):

SELECT DISTINCT SPX. НОМЕР_ДЕТАЛИ

FROM SP SPX

WHERE SPX. НОМЕР_ДЕТАЛИ IN

(SELECT SPY. НОМЕР_ДЕТАЛИ

FROM SP SPY

WHERE SPY. НОМЕР_ПОСТАВЩИКА

Ø = SPX. НОМЕР_ПОСТАВЩИКА);

Результат:

НОМЕР_ДЕТАЛИ
P1 P2 P4 P5

Действие этого запроса можно пояснить следующим образом. «Поочередно для каждой строки таблицы SP, скажем SPX, выделить значение НОМЕР_ДЕТАЛИ, если и только если это значение входит в некоторую строку, скажем SPY, таблицы SP, значение столбца НОМЕР_ПОСТАВЩИКА в которой не является его значением в строке SPX». Заметим, что в этой формулировке должен быть использован по крайней мере один псевдоним — либо SPX, либо SPY, но не они оба, может быть заменен просто на SP.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: