SQL非唯一条目查询报错:GROUP BY需含非外部引用列
解决SQL报错:'Each GROUP BY expression must contain at least one column that is not an outer reference'
我来帮你拆解这个问题并修正查询:
错误原因分析
你遇到的报错核心问题出在子查询里的GROUP BY子句:
GROUP BY LA.DateCode, C.ContainerName
子查询只从CamstarSch.A_LotAttributes表取数据,完全没有关联Container表,所以C.ContainerName属于外部引用的列,SQL Server不允许GROUP BY里全是外部引用的列,这就是报错的根源。
另外,你的需求是筛选出DateCode存在多条记录的数据,子查询里根本不需要按ContainerName分组——只需要统计每个DateCode的出现次数,判断是否大于1就行。
修正后的查询方案
方案1:修正子查询逻辑
把子查询里的GROUP BY改成只按DateCode分组,同时去掉无关的外部引用列:
SELECT LA.DateCode, C.ContainerName FROM CamstarSch.A_LotAttributes LA INNER JOIN CamstarSch.Container C ON C.ContainerId = LA.ContainerId WHERE LA.DateCode IN ( SELECT DateCode FROM CamstarSch.A_LotAttributes GROUP BY DateCode HAVING COUNT(*) > 1 );
方案2:用窗口函数(更高效,适合大数据量)
如果你想避免子查询,也可以用COUNT()窗口函数直接标记重复的DateCode:
WITH DuplicateDateCodes AS ( SELECT LA.DateCode, C.ContainerName, COUNT(*) OVER (PARTITION BY LA.DateCode) AS DateCodeCount FROM CamstarSch.A_LotAttributes LA INNER JOIN CamstarSch.Container C ON C.ContainerId = LA.ContainerId ) SELECT DateCode, ContainerName FROM DuplicateDateCodes WHERE DateCodeCount > 1;
补充说明
两种方案都能实现你的需求:返回所有DateCode存在多条记录的DateCode和对应的ContainerName。窗口函数的方案在数据量较大时通常性能更优,因为只需要扫描关联后的表一次,而子查询方案需要先扫描一次A_LotAttributes表找重复的DateCode,再扫描关联后的表过滤数据。
内容的提问来源于stack exchange,提问作者Mitchel Belmer
相关产品推荐
相关产品推荐

