SQL:选择列表中的列无效,因为它不包含在聚合函数或 GROUP BY 子句中[关闭]

Posted

技术标签:

【中文标题】SQL:选择列表中的列无效,因为它不包含在聚合函数或 GROUP BY 子句中[关闭]【英文标题】:SQL: Column invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause [closed] 【发布时间】:2016-05-11 18:22:42 【问题描述】:

列“DocumentMetadata.Custodian”在选择列表中无效,因为它既不包含在聚合函数也不包含在 GROUP BY 子句中。

SELECT Custodian Field
    ,FlagName
    ,count(1) Counts
FROM DocumentMetadata t
INNER JOIN documentreview.dbo.documentflags df ON t.documentid = df.documentid
INNER JOIN documentreview.dbo.flags f ON df.flagid = f.flagid
WHERE t.documentId IN (
        SELECT DocumentId
        FROM DocumentReview.dbo.DocumentsInSample
        WHERE SampleId = 10039
        )
    AND df.flagid = 10117

UNION

SELECT Custodian Field
    ,f2.FlagName
    ,count(1) Counts
FROM DocumentMetadata t2
INNER JOIN DocumentReview.dbo.DocumentVetting dv2 ON t2.documentid = dv2.documentid
INNER JOIN DocumentReview.dbo.FlagRelevancyMapping frm2 ON frm2.CategoryFolderId = dv2.CategoryId
INNER JOIN DocumentReview.dbo.Flags f2 ON f2.FlagId = frm2.FlagId
WHERE dv2.DocumentId IN (
        SELECT DocumentId
        FROM DocumentReview.dbo.DocumentsInSample
        WHERE SampleId = 10039
        )
    AND f2.FlagId IN (10117)
    AND f2.IsCategoryFlag = 1
    AND (
        frm2.Relevancy = dv2.Relevancy
        OR (
            frm2.Relevancy = 'MR'
            AND dv2.MaybeResolved = 1
            )
        OR (
            frm2.Relevancy = 'CCA'
            AND dv2.CrossCheckAgree = 1
            )
        OR (
            frm2.Relevancy = 'CCD'
            AND dv2.CrossCheckDisagree = 1
            )
        OR (
            frm2.Relevancy = 'VM'
            AND dv2.VettingMismatch = 1
            )
        OR (
            frm2.Relevancy = 'VMR'
            AND dv2.VettingMismatchResolved = 1
            )
        )
GROUP BY Custodian
    ,FlagName
ORDER BY Custodian
    ,FlagName

【问题讨论】:

也许您应该尝试打印它生成的 SQL 脚本并自己查看它。 Stack Overflow 不是您可以提交代码并神奇地修复它的个人调试器。 我做到了,但我找不到任何问题。因此,我在这里问这个问题。如果您无法提供帮助,请不要发表评论 您需要帮助我们帮助您。如果您不能这样做,请不要发布问题。 这里有很多东西会让大多数代码审查失败。您正在通过指定大小转换为 varchar,这意味着它将使用默认值。你知道那个默认值吗?您是否 100% 确定 MS 永远不会改变它?您到处都在使用 ANSI-89 样式的连接。 sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/…这也是开放sql注入的。 bobby-tables.com这东西需要彻底检修/重写。 你说是在执行之前把动态sql打印出来了。这就是问题所在。也许您可以发布其中的内容,以便我们为您提供帮助。 【参考方案1】:

删除 UNION 中底部查询周围的括号。

否则,您将创建一个没有别名的派生表。

错误的原因是因为你根本没有关闭那个括号。

如果“MR”是一个值而不是列名,那么您需要将它(以及所有其他类似的)括在双单引号中,如下所示:''MR''

【讨论】:

他的查询的另一个问题是在OR 语句中:frm2.Relevancy = MR - 引用不带引号的字符串值。 是的,除非这些是明确的列名... 所以整个查询本身被写成一个字符串,这就是为什么值“MR”不在引号中的原因。我没有写这个查询。我从一个旧的 s-s-rs 项目中使用它并调整了一些东西,所以我不必从头开始编写。

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

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

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

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

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

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

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