Фильтрация результатов с использованием SQL, где существует()

#sql #group-by #where-clause #exists

Вопрос:

Я использую программное обеспечение, которое позволит мне войти только ТУДА, ГДЕ… часть инструкции SQL.

Поэтому я могу использовать оператор EXISTS () в предложении where…

однако,

этот запрос…

 SELECT DISTINCT Left([PR].[WBS1],5)amp;"-000" AS WBS1 FROM PR GROUP BY Left([PR].[WBS1],5), Right([PR].[WBS1],3), PR.Status HAVING ((Right(PR.WBS1,3)lt;gt;'000') And ((PR.Status)='A') And (Count(PR.Org))gt;1)  

…возвращает 78 записей.

пока,

практически тот же запрос с WHERE СУЩЕСТВУЕТ…

 SELECT PR.WBS1 FROM PR WHERE EXISTS (  SELECT DISTINCT Left([PR].[WBS1],5)amp;"-000" AS WBS1 FROM PR GROUP BY Left([PR].[WBS1],5), Right([PR].[WBS1],3), PR.Status HAVING ((Right(PR.WBS1,3)lt;gt;'000') And ((PR.Status)='A') And (Count(PR.Org))gt;1)  )  

…возвращает все 31 114 записей.

И я действительно не понимаю, почему.

Что я делаю не так; кто-нибудь может мне это объяснить, пожалуйста?

правка: Что я могу добавить сюда, чтобы вернуть те же 78 записей:

 SELECT * FROM PR WHERE (   ?  )  

Бухгалтерское программное обеспечение, которое я использую, позволяет мне редактировать только часть «где».

Ответ №1:

EXISTS возвращает TRUE , если подзапрос внутри круглых скобок возвращает по крайней мере 1 строку или FALSE если подзапрос не возвращает ни одной строки.

В вашем случае подзапрос возвращает 78 строк, поэтому EXISTS возвращает TRUE .

Таким образом, ваш 2-й запрос эквивалентен:

 SELECT PR.WBS1 FROM PR WHERE 1=1 -- any boolean expression that returns TRUE  

или просто:

 SELECT PR.WBS1 FROM PR