列 'CM.PfmFolder.Id' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中

Posted

技术标签:

【中文标题】列 \'CM.PfmFolder.Id\' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中【英文标题】:Column 'CM.PfmFolder.Id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause列 'CM.PfmFolder.Id' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中 【发布时间】:2014-03-19 04:01:37 【问题描述】:

获取列“CM.PfmFolder.Id”在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。请建议我如何重新构建此查询

 SELECT                     
 F.Id                    
,F.FolderNo                    
,F.FolderStatusDate
,(SELECT CodeDesc FROM CM.CodeTable WHERE Id = F.FolderStatusCode) 'FolderStatus'                    
,(SELECT CodeDesc FROM CM.CodeTable WHERE Id = F.FolderLocationCode) 'Location'                    
,F.Volume                    
,F.SDExhibits                    
,F.Cost                    
,F.Remarks                    
 FROM CM.PfmFolder F WITH(NOLOCK, INDEX(IX)) INNER JOIN                    
(                    
 CM.PfmFolderMstIpMap MAP WITH(NOLOCK, INDEX(ix_FF))                  
 INNER JOIN  CM.MstIp IP WITH(NOLOCK) ON MAP.MstIpFK = IP.Id                   
 AND IP.RegistryCode = @RegistryCode                    
 AND IP.DeletedBy IS NULL                      
 AND MAP.DeletedBy IS NULL                      
)                    
ON MAP.PfmFolderFK = F.Id                    
AND F.DeletedBy IS NULL      
AND (                    
 F.FolderStatusDate >= @FolderStatusDateFrom                    
 AND F.FolderStatusDate < @FolderStatusDateTo                    
 )                    
AND (                    
  @FolderLocationCode IS NULL                    
  OR @FolderLocationCode = @GUID_EMPTY                    
  OR F.FolderLocationCode = @FolderLocationCode                    
 )                    
AND (                    
  @FolderStatusCode IS NULL                    
  OR @FolderStatusCode = @GUID_EMPTY                    
  OR F.FolderStatusCode = @FolderStatusCode                    
 )
 GROUP BY F.Id

【问题讨论】:

CM.PfmFolder F CM 是 PfmFolder 的别名还是什么? 我们所有的表格都以 CM 开头,它不是别名。它的表名CM.PfmFolder,F是CM.PfmFolder的别名 你试过没有GROUP BY F.Id 没有按其工作正常分组...但得到重复数据。如果我使用 distinct 查询性能会很慢 你不能像那样使用 Group by...你需要在 Select 中拥有所有项目才能使用 group by 【参考方案1】:

您必须对除 ID 之外的其他列使用聚合函数,以便为每个分组的 F.Id 获取不同的值。

您也可以像这样使用排名函数:

试试这个

SELECT * FROM
(
SELECT                     
 F.Id                    
,F.FolderNo                    
,F.FolderStatusDate
,(SELECT CodeDesc FROM CM.CodeTable WHERE Id = F.FolderStatusCode) 'FolderStatus'                    
,(SELECT CodeDesc FROM CM.CodeTable WHERE Id = F.FolderLocationCode) 'Location'                    
,F.Volume                    
,F.SDExhibits                    
,F.Cost                    
,F.Remarks,
Row_number() OVER(partition BY F.Id  ORDER BY (SELECT NULL) ASC) RN              
 FROM CM.PfmFolder F WITH(NOLOCK, INDEX(IX)) INNER JOIN                    
(                    
 CM.PfmFolderMstIpMap MAP WITH(NOLOCK, INDEX(ix_FF))                  
 INNER JOIN  CM.MstIp IP WITH(NOLOCK) ON MAP.MstIpFK = IP.Id                   
 AND IP.RegistryCode = @RegistryCode                    
 AND IP.DeletedBy IS NULL                      
 AND MAP.DeletedBy IS NULL                      
)                    
ON MAP.PfmFolderFK = F.Id                    
AND F.DeletedBy IS NULL      
AND (                    
 F.FolderStatusDate >= @FolderStatusDateFrom                    
 AND F.FolderStatusDate < @FolderStatusDateTo                    
 )                    
AND (                    
  @FolderLocationCode IS NULL                    
  OR @FolderLocationCode = @GUID_EMPTY                    
  OR F.FolderLocationCode = @FolderLocationCode                    
 )                    
AND (                    
  @FolderStatusCode IS NULL                    
  OR @FolderStatusCode = @GUID_EMPTY                    
  OR F.FolderStatusCode = @FolderStatusCode                    
 )
) AS T
Where RN = 1

【讨论】:

T 是您的 Select 语句的别名,RN 是 Row_Number 的别名 Great Query 工作正常,但执行 300K 数据需要 16 秒。有没有其他方法可以优化以获得更好的性能 你可以试试 CTE technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx @user1030181 我也在这里回答了你的问题***.com/a/22496825/2118383【参考方案2】:

您还可以检查您的加入条件并确保它们给出不同的结果。这些重复项可能是由这些条件引起的。

男男性接触者

【讨论】:

以上是关于列 'CM.PfmFolder.Id' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中的主要内容,如果未能解决你的问题,请参考以下文章

选择列表中的列无效

通过在下拉列表中选择数据库列调用 jsp 进行自动建议搜索框

选择列表中的列无效,因为该列没有包含在聚合函数或 GROUP BY 子句中

如何在单独的列中添加排序列名称,而不是在下拉列表中选择列来对表进行排序?

Amazon Redshift:根据表中存在的列列表选择列

列“在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中”