РУКОВОДСТВО ПО РЕЛЯЦИОННОЙ СУБД DB2

         

ПОДЗАПРОС С ОПЕРАТОРОМ СРАВНЕНИЯ, ОТЛИЧНЫМ ОТ IN


Выдать номера поставщиков, находящихся в том же городе, что и поставщик S1.

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

FROM                   S

WHERE                ГОРОД =

(SELECT                     ГОРОД

FROM                          S

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

Результат:

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



S1

S4

Иногда пользователь может знать, что заданный подзапрос должен возвратить в точности одно значение, как в рассматриваемом примере. В таком случае можно использовать вместо обычного IN более простой оператор сравнения (например, =, > и т. д.). Однако, если подзапрос возвращает более одного значения и не используется оператор IN, будет возникать ошибка. Ошибка не возникнет, если подзапрос не возвратит вообще ни одного значения. При этом сравнение интерпретируется в точности так, как если бы подзапрос возвратил неопределенное значение. Иными словами, если х — переменная, то сравнение

х простой—оператор—сравнения (подзапрос),

где «подзапрос» возвращает пустое множество, имеет значение истинности не истина или ложь, а неизвестно

(см. главу 4, пример 4.2.10).

Нужно отметить, что сравнение в предыдущем примере должно быть записано именно так, как показано — подзапрос должен следовать за оператором сравнения. Иначе говоря, следующая запись запроса некорректна:

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

FROM                   S

WHERE                (SELECT ГОРОД

FROM                          S

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

Более того, подзапрос не может включать фраз GROUP BY или HAVING, если он используется с простым оператором сравнения, например с =, > и т. д.



Содержание раздела