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;
我从此代码中得到一个错误:
消息8120 16级。
选择列表中的“ T2.a”列无效,因为它既不包含在聚合函数中也不在GROUP BY子句中。
由于T1.a和T2.a已加入,我本希望它能工作
答案 0 :(得分:2)
由于T1.a和T2.a已加入,我本希望它能工作
这是有道理的,但不幸的是:没有。 SQL Server在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 Server则不是如此:
SELECT a
FROM T1
JOIN T2 ON USING(a)
GROUP BY a
答案 1 :(得分:1)
由于T1.a和T2.a已加入,我本希望它能工作
SQL标准指出,当同一表的列之间存在依赖关系时,就不需要汇总依赖关系的列。例如,如果您通过主键进行汇总,则无需汇总相同表中的其他列。但是,情况并非如此,因为T2.a
在不同的表上。尽管如此,SQL Server仍未实现标准的那部分。
现在,只需稍作更改即可:
SELECT T1.a , T2.a
FROM T1
JOIN T2 ON T1.a=T2.a
GROUP BY T1.a , T2.a;
请参见DB Fiddle上的运行示例。
答案 2 :(得分:0)
只需在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 Server通过t1.a
对同一行进行分组时,它不知道应该为t2.a
选择哪一列。