Коррелированный подзапрос SQL

На следующем рисунке показаны две таблицы и SQL-запрос.

Вопрос этого задания: что будет результатом запроса?

Я знаю ответ, но я не очень понимаю, как работает SQL-запрос, особенно в строке, которую я пометил знаком вопроса.

Пока я понял, что сначала мы объединяем две таблицы из подзапроса

SQL-запрос:

select Count(*)  
from OrderDetails as OD 
inner join [Order] as O on OD.idOrder = O.id  
where SalePrice = all (select Price  
                       from OrderDetails 
                       inner join [Order] on OrderDetails.idOrder = [Order].id  
                       where idCustomer != O.idCustomer 
                         and OrderDetails.idProduct = OD.idProduct)

person hmyroom    schedule 10.10.2018    source источник
comment
Что такое движок базы данных? Похоже на SQL Server.   -  person The Impaler    schedule 10.10.2018
comment
В задании не указано, что это за СУБД.   -  person hmyroom    schedule 10.10.2018
comment
кроме кавычек идентификаторов и нестандартного оператора не равно, это стандартный SQL. Не обязательно знать, чтобы ответить на вопрос.   -  person Martin Smith    schedule 10.10.2018
comment
В вашем примере, если ваш подзапрос не вернет только 1 запись с SalePrice, которая существует в вашем основном запросе, вы не получите данные обратно. Это происходит из-за оператора, предшествующего ALL ('='). Очень хорошую иллюстрацию ВСЕХ можно найти здесь: w3resource.com/sql/special -operators/sql_all.php   -  person Saravana Kannadasan    schedule 10.10.2018
comment
Совет. Причины не использовать изображения приведены здесь.   -  person HABO    schedule 10.10.2018


Ответы (1)


В качестве логического описания сначала начните с расширения объединения, поскольку оно используется как внешним запросом, так и подзапросом.

введите здесь описание изображения

Первая строка на изображении выше имеет idCustomer из 1 и idProduct из 1. Подзапрос ищет все строки с одинаковым идентификатором продукта и другим идентификатором клиента. Для первой строки есть две строки, соответствующие этой комбинации (выделены желтым цветом в обоих столбцах). Это те, у которых столбец Price выделен красным цветом ниже.

введите здесь описание изображения

Столбец SalePrice из внешней строки имеет значение 1. Это то же самое, что и все значения Price, выделенные красным (т. е. ни одно из них не имеет другого значения), поэтому первая внешняя строка соответствует предикату = ALL и участвует в подсчете.

Тот же процесс повторяется для оставшихся 9 строк, возвращаемых соединением.

person Martin Smith    schedule 10.10.2018