列 '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 子句中