выберите количество(*) в предложении WHERE, для которого требуется оператор сравнения

#postgresql

Вопрос:

Немного новичок в SQL, поэтому я читал некоторые запросы и случайно наткнулся на это (https://iggyfernandez.wordpress.com/2011/12/04/day-4-the-twelve-days-of-sql-there-way-you-write-your-query-matters/)

Часть, которая вызвала у меня любопытство, — это совокупный запрос в предложении WHERE. Возможно, это мое недопонимание, но как работает авторский код (показан ниже)? Я предположил, что Count(*) — или, скорее, агрегатные функции не могут использоваться в предложении WHERE, и для этого вам нужно ИМЕТЬ ?

 SELECT per.empid, per.lname
FROM personnel per
WHERE (SELECT count(*) FROM payroll pay WHERE pay.empid = per.empid AND pay.salary = 199170) > 0;
 

Мой второй вопрос будет заключаться в том, зачем нужен оператор сравнения (>0)? Я играл и заметил, что он не будет работать в PostgreSQL без >0; кроме того, его переформатирование для предложения HAVING by значительно увеличивает время выполнения запроса

 SELECT per.empid, per.lname 
FROM personnel per
WHERE EXISTS (SELECT per.empid FROM payroll pay WHERE pay.empid = per.empid AND pay.salary = 199170)
GROUP BY per.empid, per.lname
HAVING COUNT(*) > 0;
 

Ответ №1:

Опустите GROUP BY HAVING предложения и в вашей версии, тогда ваш запрос будет более эффективным и эквивалентным исходному.

В исходном запросе count(*) отображается в SELECT списке подзапроса. Вы можете использовать заключенный в скобки подзапрос практически в любом месте инструкции SQL.