Не выполняется агрегация по подзапросу

Симонов Денис
Дата: 27.04.2012 14:31:01
Вообщем потребовалось мне в одном месте выполнить агрегацию данных по подзапросу. Ничего не получилось. Решил проверить на более простом примере.

SELECT COUNT(*),
       (SELECT 1 FROM RDB$DATABASE C WHERE D.RDB$RELATION_ID=C.RDB$RELATION_ID) AS n
FROM RDB$DATABASE D
GROUP BY 2


Пишет:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).

Вот так всё нормально.

SELECT
       (SELECT 1 FROM RDB$DATABASE C WHERE D.RDB$RELATION_ID=C.RDB$RELATION_ID) AS n
FROM RDB$DATABASE D


так тоже

SELECT COUNT(*),
       (SELECT 1 FROM RDB$DATABASE C WHERE 1=1) AS n
FROM RDB$DATABASE D
GROUP BY 2


Это баг или я чего-то не понимаю?
Симонов Денис
Дата: 27.04.2012 14:48:22
Версия Firebird 2.5.1.26351
Dimitry Sibiryakov
Дата: 27.04.2012 14:51:11

Симонов Денис
Это баг или я чего-то не понимаю?

Ага, не понимаешь. D.RDB$RELATION_ID в GROUP BY есть? Нету.

Posted via ActualForum NNTP Server 1.5

Симонов Денис
Дата: 27.04.2012 14:54:09
Спасибо. Так работает. На будующее учту.
Симонов Денис
Дата: 27.04.2012 15:07:45
Так работает

Хотя результат не тот. Пришлось использовать Devired Table
WildSery
Дата: 28.04.2012 03:11:17
Симонов Денис,

Результат не тот, когда запрос написан неправильно, или автор не понимает, как оно работает.
Симонов Денис
Дата: 28.04.2012 08:33:20
Да всё я понял. Мне почему то казалось, что запрос будет агрегироваться уже вместе с результатом подзапроса. Каюсь был не прав.
WildSery
Дата: 28.04.2012 19:09:31
Симонов Денис,

Гут! Может и без derived можно было обойтись? Хотя нынче без разницы, надо из сознания вырезать закостенелость "если без derived можно обойтись, то нужно обойтись".
Симонов Денис
Дата: 28.04.2012 19:20:11
Может и можно. Вот только зачем? Решение найдено, производительность меня устраивает. Код с использованием CTE довольно понятен.