#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.