#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