ВОПРОС
Почему запрос CROSS APPLY со столбцами и агрегатными функциями, смешанными в SELECT, не работает? для этого требуется предложение GROUP BY или все столбцы с агрегатной функцией.
КОД
CREATE TABLE A
(
A_ID int identity(1,1),
A_NAME Varchar(20)
)
INSERT INTO A (A_NAME)
VALUES
('A'), ('AA'), ('AAA')
CREATE TABLE B
(
B_ID int identity(10,10),
B_NAME Varchar(20),
A_ID int
)
INSERT INTO B (B_NAME, A_ID)
VALUES
('B', 1), ('BB', 3), ('BBB', 2)
--НЕ РАБОТАЕТ, ЕСЛИ SELECT ИМЕЕТ СТОЛБЦЫ, СМЕШАННЫЕ С ФУНКЦИЕЙ АГРЕГАТА
SELECT A_NAME, MAX(B_NAME)
FROM A
CROSS APPLY(SELECT * FROM B WHERE B.A_ID = A.A_ID) as AxB
--РАБОТАЕТ С АГРЕГАТИВНЫМИ ФУНКЦИЯМИ
SELECT MAX(A_NAME), MAX(B_NAME)
FROM A
CROSS APPLY(SELECT * FROM B WHERE B.A_ID = A.A_ID) as AxB
--РАБОТАЕТ С ГРУППОЙ
SELECT A_NAME, MAX(B_NAME)
FROM A
CROSS APPLY(SELECT * FROM B WHERE B.A_ID = A.A_ID) as AxB
GROUP BY A_NAME
--ПЕРЕЗАГРУЗИТЬ
DROP TABLE A
DROP TABLE B
ОБНОВЛЕНИЕ
ЗАКЛЮЧЕНИЕ (спасибо @Richardissimo's)
У меня есть фон Sybase 15.7, и там вы можете смешивать столбцы с агрегатными функциями и не иметь группы по пункту. в таких ситуациях группой по умолчанию будет вся таблица. поэтому в моем коде я ожидал максимального B_NAME для всех A_NAMES в таблице.
Однако в SQL Server, когда я тестировал код без перекрестного применения, я получил ту же ошибку. Похоже, SQL Server запрещает такое поведение. Что довольно круто, этим они говорят, что вы не получите больше строк, чем количество групп в агрегированном запросе.
ЭТО ПОСЛЕДОВАТЕЛЬНОСТЬ
MAX(
. - person Richardissimo   schedule 04.11.2018