FROM Блюда
WHERE ID_Блюда = ANY (SELECT Блюдо
FROM Меню
WHERE Дата = '2011-01-02');
Оператор ANY берет все значения выведенные подзапросом, (для этого случая - это все значения Блюд в таблице Меню на указанную дату), и оценивает их как верные, если любой(ANY) из них равняется значению Блюда текущей строки внешнего запроса.
Следует отметить, что подзапрос должен выбирать значения такого же типа как и те, которые сравниваются в основном предикате. В этом его отличие от EXISTS, который просто определяет, производит ли подзапрос результаты или нет, и фактически не использует эти результаты.
Если при работе оператора ANY используется равенство, то этот запрос может быть всегда заменен запросом с IN
SELECT Блюдо
FROM Блюда
WHERE ID_Блюда IN (SELECT Блюдо
FROM Меню
WHERE Дата = '2011-01-02');
или EXISTS.
SELECT Блюдо
FROM Блюда b
WHERE EXISTS (SELECT Блюдо
FROM Меню m
WHERE Дата = '2011-01-02' and m.Блюдо = b. ID_Блюда);
Однако оператор ANY может использовать и другие реляционные операторы, кроме равенства, и таким образом, делать сравнения которые являются выше возможностей IN. Например, мы сделали заказ, но не рассчитали с деньгами и нам требуется замена некоторых блюд на более дешевые блюда.
Пример 35.
Список блюд с ценой, меньшей, чем любое блюдо из заказа номер 2.