2017-02-11 26 views
0

Я пытаюсь понять, как работает EXISTS.Существует суб-запрос с предложением HAVING

Следующий запрос основан на this ответ, и он запрашивает для всех SalesOrderID с, которые имеют более чем на 1 запись в таблице, где в аренду один из этих записей имеет OrderQty > 1 и ProductID = 777:

USE AdventureWorks2012; 
GO 
SELECT SalesOrderID, OrderQty, ProductID 
FROM Sales.SalesOrderDetail s 
WHERE EXISTS 
     ( SELECT 1 
      FROM Sales.SalesOrderDetail s2 
      WHERE s.SalesOrderID = s2.SalesOrderID 
      GROUP BY SalesOrderID 
      HAVING COUNT(*) > 1 
      AND COUNT(CASE WHEN OrderQty > 1 AND ProductID = 777 THEN 1 END) >= 1 
     ); 

Что Я не понимаю: Sub-query возвращает таблицу с одним столбцом, заполненную значением 1 для каждой строки. Таким образом, как я понимаю, во внешнем запросе WHERE не имеет реального условия для применения, просто связка 1 s. Почему \ Как, тогда внешний запрос возвращает только часть Sales.SalesOrderDetail, а не его целостность?

+1

Из-за условия 'WHERE' в подзапросе. Это называется * коррелированным подзапросом *. –

+0

@ GordonLinoff, требуется 'GROUP BY'? он дает тот же результат без него. – HeyJude

ответ

0

Что происходит в EXISTS, так это то, что он проверяет, соответствует ли запись из внешней таблицы условиям, указанным во внутреннем запросе. Вот почему мы указываем «1» в отличие от IN, где нам нужно указывать отдельные столбцы (и данные проверяются для каждой записи).

Таким образом, он не возвращает ни одного букета 1 и проверяет его. Как следует из названия, он проверяет только наличие записи в соответствии с данным условием.

Надеюсь, это уточнит.

Примечание. Всегда используйте имена псевдонимов таблицы для столбцов, чтобы предотвратить неоднозначность.

0

внутренний SELECT 1 ... не всегда будет возвращать 1.

Когда внутреннее WHERE/HAVING условие не выполнено, вы не получите 1 возвращается. Вместо этого ничего не будет, я имею в виду, что SQL Server Management Studio (если я правильно назову) покажут NO результат вообще, даже NULL для внутреннего SELECT 1, таким образом, не удалив весь внешний WHERE для этой конкретной строки.

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

 Смежные вопросы

  • Нет связанных вопросов^_^