如何在加入后获取列值并在加入后计数?

时间:2015-08-12 08:40:33

标签: sql sql-server

我意识到这已经在某处发布,但由于关键字密度,我无法找到它。

我目前有以下查询:

SELECT COUNT(t2.*), t1.t2id, t1.c2
FROM t1 
LEFT JOIN t2 ON t1.t2id = t2.t2id
GROUP BY t1.t2id

注意t2idnchar(256),t1.c2是ntext

所以基本上我想计算t1中每个值记录有多少t2,并从t1获取一些值。现在的问题是,当我在c#中执行此操作时,我得出错误

  

类型'System.Data.SqlClient.SqlException'的未处理异常   发生在System.Data.dll

中      

附加信息:列't1.c2'在选择列表中无效   因为它不包含在聚合函数或   GROUP BY子句。

GROUP BY t1.t2id不应该确保不会发生这种情况吗?

3 个答案:

答案 0 :(得分:2)

你需要

SELECT COUNT(t2.*), t1.t2id, t1.c2 
FROM t1 LEFT JOIN t2 ON t1.t2id = t2.t2id 
GROUP BY t1.t2id, t1.c2

r1.c2不在聚合(计数)或组中,因此需要进入一个。

编辑:处理t1.c2为ntext

SELECT COUNT(t2.*), t1.t2id, cast(t1.c2 as nvarchar(max))
FROM t1 LEFT JOIN t2 ON t1.t2id = t2.t2id 
GROUP BY t1.t2id, cast(t1.c2 as nvarchar(max))

如果您的c2列的内容比nvarchar(max)更多可以解决您的问题,那么性能也不会很好但是如果它出现问题就不知道您有多少数据很难说

答案 1 :(得分:1)

问题是,正如错误消息所示,您需要在以下内容中传递t1.c2GROUP BY子句:

string query = "SELECT COUNT(t2.*),t1.t2id,t1.c2   FROM t1 LEFT JOIN t2 ON t1.t2id = t2.t2id GROUP BY t1.t2id, t1.c2";

答案 2 :(得分:0)

一般规则是所有不属于聚合函数的列都应出现在GROUP BY子句中。您需要在group by子句

中添加t1.c2
SELECT COUNT(t2.*), t1.t2id, t1.c2
FROM t1 LEFT JOIN t2 ON t1.t2id = t2.t2id
GROUP BY t1.t2id,t1.c2