loading..
Русский    English
23:36
листать

Предикат EXISTS

Синтаксис:

  1. EXISTS::=
  2. [NOT] EXISTS (<табличный подзапрос>)

Предикат EXISTS принимает значение TRUE, если подзапрос содержит любое количество строк, иначе его значение равно FALSE. Для NOT EXISTS все наоборот. Этот предикат никогда не принимает значение UNKNOWN.

Обычно предикат EXISTS используется в зависимых (коррелирующих) подзапросах. Этот вид подзапроса имеет внешнюю ссылку, связанную со значением в основном запросе. Результат подзапроса может зависеть от этого значения и должен оцениваться отдельно для каждой строки запроса, в котором содержится данный подзапрос. Поэтому предикат EXISTS может иметь разные значения для разных строк основного запроса.

Пример на пересечение.

Найти тех производителей портативных компьютеров, которые также производят принтеры:

Консоль
Выполнить
  1. SELECT DISTINCT maker
  2. FROM Product AS lap_product
  3. WHERE type = 'laptop' AND
  4. EXISTS (SELECT maker
  5. FROM Product
  6. WHERE type = 'printer' AND
  7. maker = lap_product.maker
  8. );

В подзапросе выбираются производители принтеров и сравниваются с производителем, значение которого передается из основного запроса. В основном же запросе отбираются производители портативных компьютеров. Таким образом, для каждого производителя портативных компьютеров проверяется, возвращает ли подзапрос строки (которые говорят о том, что этот производитель также выпускает принтеры). Поскольку два условия в предложении WHERE должны выполняться одновременно (AND), то в результирующий набор попадут нужные нам строки. DISTINCT используется для того, чтобы каждый производитель присутствовал в выходных данных только один раз. В результате получим

maker
A

Пример на разность.

Найти производителей портативных компьютеров, которые не производят принтеров:

Консоль
Выполнить
  1. SELECT DISTINCT maker
  2. FROM Product AS lap_product
  3. WHERE type = 'laptop' AND
  4. NOT EXISTS (SELECT maker
  5. FROM Product
  6. WHERE type = 'printer' AND
  7. maker = lap_product.maker
  8. );

В этом случае достаточно заменить в предыдущем примере EXISTS на NOT EXISTS. То есть выходные данные составят только те уникальные строки основного запроса, для которых подзапрос не возвращает ни одной строки. В итоге получим:

maker
B
C

Рекомендуемые упражнения: 27, 36, 39, 128

Bookmark and Share
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INNER JOIN insert INTERSECT IS NOT NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX MIN Больше тэгов
Учебник обновлялся
несколько дней назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100