сгруппировать по двум соединенным столбцам - PullRequest
0 голосов
/ 24 апреля 2020
CREATE TABLE T1 (a int);

CREATE TABLE T2 (a int);

SELECT T1.a , T2.a
FROM T1
JOIN T2 ON T1.a=T2.a
GROUP BY T1.a;

Я получаю сообщение об ошибке этого кода:

Msg 8120 Уровень 16.
Недопустимый столбец 'T2.a' в списке выбора, поскольку он не содержится ни в одном из них. агрегатная функция или предложение GROUP BY.

Я бы ожидал, что это сработает, потому что T1.a и T2.a объединены

Ответы [ 3 ]

2 голосов
/ 24 апреля 2020

Я бы ожидал, что это сработает, потому что T1.a и T2.a объединены

Это имеет смысл, но, к сожалению: нет. SQL Сервер видит два разных неагрегированных столбца в предложении SELECT и запрашивает их также в предложении GROUP BY:

SELECT T1.a, T2.a
FROM T1
JOIN T2 ON T1.a = T2.a
GROUP BY T1.a, T2.a

С другой стороны, поскольку вы присоединяясь к этим столбцам, вы также знаете, что оба имеют одинаковое значение, поэтому зачем вам выводить оба в наборе результатов?

SELECT T1.a
FROM T1
JOIN T2 ON T1.a = T2.a
GROUP BY T1.a

Некоторые базы данных поддерживают синтаксис USING для объединений, что устраняет неоднозначность имена столбцов, если оба одинаковы, но не SQL Сервер:

SELECT a
FROM T1
JOIN T2 ON USING(a)
GROUP BY a
1 голос
/ 24 апреля 2020

Я бы ожидал, что это сработает, потому что T1.a и T2.a объединены

Стандарт SQL гласит, что при наличии зависимости между столбцами та же таблица , нет необходимости объединять зависимые. Например, если вы агрегируете по первичному ключу, вам не нужно агрегировать другие столбцы таблицы той же . Однако это не так, поскольку T2.a находится на другой таблице. Тем не менее, SQL Сервер в любом случае не реализует эту часть стандарта.

Теперь, с незначительными изменениями, он работает:

SELECT T1.a , T2.a
FROM T1
JOIN T2 ON T1.a=T2.a
GROUP BY T1.a , T2.a;

См. Пример работы на DB Fiddle .

0 голосов
/ 24 апреля 2020

Просто добавьте t2.a столбец в GROUP BY:

SELECT 
T1.a , T2.a
FROM T1
JOIN T2 ON T1.a= T2.a
GROUP BY T1.a, T2.a;

Необходимо добавить t2.a, так как SQL Сервер группирует одинаковые строки по t1.a, он не знает какой столбец следует выбрать для t2.a.

...