JOIN Наличие n ON s.Продукт = n.Продукт
WHERE b.ID_Блюда NOT IN (select Блюдо from Заказы where ID_Заказ = 2)
GROUP BY b.Блюдо,b.ID_Блюда, b.Труд
HAVING (SUM (s.Вес * n.Цена/1000)+b.Труд) < ANY
(SELECT SUM (s.Вес*n.Цена/1000)+b.Труд as Стоимоть
FROM ((Блюда b JOIN Состав s ON b.ID_Блюда = s.Блюдо)
JOIN Наличие n ON s.Продукт = n.Продукт)
JOIN Заказы z ON s.Блюдо = z.Блюдо
WHERE ID_Заказ = 2
GROUP BY b.Блюдо, b.Труд);
Подзапрос определяет стоимость блюд заказа. Эти данные используются для отбора в основном запросе.
Оператор ALL.
С помощью ALL, предикат является верным, если каждое значение выбранное подзапросом удовлетворяет условию в предикате внешнего запроса. Если мы хотим найти самый дорогой (дешевый Цена <=) продукт, то можем это сделать следующим образом:
Пример 36.
SELECT Продукт FROM Наличие
WHERE Цена >= ALL (SELECT DISTINCT Цена FROM Наличие);
Т.е. мы найдем те продукты, которые имеют цену выше или равную всем остальным (максимальную). Как и в случае с ANY, мы можем использовать EXISTS для производства альтернативной формулировки такого же запроса:
SELECT Продукт
FROM Наличие n
WHERE NOT EXISTS (SELECT * FROM Наличие n1
WHERE n1.Цена > n.Цена);
ALL чаще используется с неравенствами, чем с равенствами, так как значение может быть "равным для всех" результатом подзапроса, только если все результаты, фактически, идентичны. Рассмотрим следующий запрос:
Пример 37.
SELECT Продукт
FROM Наличие
WHERE Цена = ALL (SELECT DISTINCT Цена FROM Наличие);
Эта команда допустима, но, мы не получим никакого вывода. Только в единственном случае вывод будет выдан этим запросом - если все цены на продукты окажутся одинаковыми.
В SQL, выражение - < > ALL - в действительности соответствует " не равен любому " результату подзапроса. Другими словами, предикат верен, если данное значение не найдено среди результатов подзапроса.
Следует отметить, что вариант с EXISTS не абсолютно идентичен вариантам с ANY(ALL) из-за различия в том как обрабатываются NULL-значения. Всякий раз, когда допустимый подзапрос не в состоянии сделать вывод, ALL - автоматически верен, а ANY автоматически неправилен. Большинство пользователей, однако, находят ANY и ALL более удобными в использовании, чем EXISTS, который требует соотнесенных подзапросов. Кроме того, в зависимости от реализации, ANY и ALL могут, по крайней мере, в теории, быть более эффективными, чем EXISTS. Подзапросы ANY или ALL могут выполняться один раз и иметь вывод, используемый чтобы определять предикат для каждой строки основного запроса. EXISTS, с другой стороны, берет соотнесенный подзапрос, который требует, чтобы весь подзапрос повторно выполнялся для каждой строки основного запроса. Основная причина для формулировки EXISTS как альтернативы ANY и ALL в том, что ANY и ALL могут быть несколько неоднозначен, из-за способа использования этого термина в Английском языке.
Правильное понимание ANY и ALL.
В SQL, сказать что - значение больше (или меньше) чем любое(ANY) из набора значений – то же самое что сказать, что оно больше (или меньше) чем любое одно отдельное из этих значений. И наоборот, сказать, что значение не равно всему(ALL) набору значений, тоже что сказать, что нет такого значения в наборе которому оно равно.
Do'stlaringiz bilan baham: |