Требуется ли GROUP BY в следующем коррелированном подзапросе? - PullRequest
0 голосов
/ 27 декабря 2011

Данный сценарий:

table fd  
(cust_id, fd_id) primary-key and amount  

table loan  
(cust_id, l_id) primary-key and amount

Я хочу перечислить всех клиентов, у которых есть фиксированный депозит, с суммой, меньшей суммы всех их кредитов.1007 *

У клиента может быть несколько займов, но одновременно рассматривается один FD.

Ответы [ 4 ]

4 голосов
/ 27 декабря 2011

GROUP BY в этом случае можно опустить , поскольку в списке SELECT есть только одна (одна) агрегатная функция (и) и все строки гарантированно принадлежат одной и той же группе cust_id (согласно предложению WHERE).

Агрегация будет по всем строкам с совпадением cust_id в обоих случаях. Так что оба запроса верны.


Это будет очиститель другой способ реализовать то же самое:

SELECT fd.cust_id
FROM   fd
JOIN   loan USING (cust_id)
GROUP  BY fd.cust_id, fd.amount
HAVING fd.amount < sum(loan.amount)

Существует одно отличие : строки с одинаковыми (cust_id, amount) в fd появляются только один раз в результате моего запроса, тогда как в оригинале они появляются несколько раз.

В любом случае, если в таблице loan нет подходящей строки с ненулевым amount, вы получите без строк . Я полагаю, вы знаете об этом.

2 голосов
/ 27 декабря 2011

Нет, это не так, потому что вы рассчитываете sum(amount) для клиента с id = fd.cust_id, то есть для одного клиента.

Однако, если каким-либо образом ваш подзапрос вычисляет сумму для более чем одного клиента, group by приведет к тому, что подзапрос сгенерирует более одной строки, и это приведет к сбою условия (<) и, следовательно, к сбою запроса . </p>

2 голосов
/ 27 декабря 2011

Нет необходимости в GROUP BY, поскольку вы фильтровали данные по cust_id. В любом случае внутренний запрос вернет тот же результат.

1 голос
/ 27 декабря 2011

Запрос с агрегатом типа sum, но без group by выведет одну группу. Агрегаты будут вычисляться по всем соответствующим строкам.

Подзапросу в условии условия разрешено возвращать только одну строку. Если подзапрос вернул несколько строк, что означало бы следующее выражение?

where 1 > (... subquery ...)

Таким образом, group by должен быть опущен; вы даже получите ошибку для вашего второго запроса.

N.B. Когда вы указываете all, any или some , подзапрос может возвращать несколько строк:

where 1 > ALL (... subquery ...)

Но легко понять, почему это не имеет смысла в вашем случае; вы бы сравнили данные одного клиента с данными другого.

...