【问题标题】:SQL Server - Each GROUP BY expression must contain at least one column that is not an outer referenceSQL Server - 每个 GROUP BY 表达式必须至少包含一个不是外部引用的列
【发布时间】:2018-08-22 15:48:20
【问题描述】:

我需要识别所有 MostRecent=-1、OilWell=-1 的记录,以及具有相同 Api 的重复记录,并将它们连接起来以获取关联的 CompanyName。

使用查询:

SELECT 
    BLMAPDCONTACT.CompanyName, APD.Api, APD.ID, APD.MostRecent, 
    APD.Project_Nu, APD.Unit_Lease, APD.Well_Nu, APD.OilWell
FROM 
    APD 
INNER JOIN 
    BLMAPDCONTACT ON APD.BLM_APD_Cont = BLMAPDCONTACT.OBJECTID
WHERE 
    (APD.Api IN (SELECT APD.Api 
                 FROM APD AS Tmp 
                 WHERE APD.MostRecent = -1 AND APD.OilWell = -1 
                 GROUP BY APD.Api 
                 HAVING Count(APD.Api) > 1))
ORDER BY 
    APD.Api DESC;

我收到此错误:

每个 GROUP BY 表达式必须至少包含一个不是外部引用的列。

这个错误是我添加JOIN子句后出现的;没有它,它起作用了。

所需输出示例将匹配 APD 表中的以下记录:

APD.Api | APD.MostRecent | APD.OilWell
--------------------------------------
123     | -1             | -1
123     | -1             | -1

而不是:

APD.Api | APD.MostRecent | APD.OilWell
--------------------------------------
321     | 0              | -1
321     | -1             | -1

【问题讨论】:

  • 嗨。您将 APD 别名为 tmp,因此您需要使用 tmp 列对表达式进行分组。大概其他内部选择 APD 列引用也应该使用 tmp 。但是为什么别名呢? PS请阅读minimal reproducible example并采取行动。 PS您询问错误。但是获取带有重复子行的行是一个常见问题。所以这是一种查看正确查询的方法。

标签: sql-server group-by count inner-join


【解决方案1】:

你试过了吗:

SELECT BLMAPDCONTACT.CompanyName, APD.Api, APD.ID, APD.MostRecent, APD.Project_Nu, APD.Unit_Lease, APD.Well_Nu, APD.OilWell
FROM APD INNER JOIN BLMAPDCONTACT ON APD.BLM_APD_Cont = BLMAPDCONTACT.OBJECTID
WHERE (APD.Api IN 
    (SELECT tmp.Api 
    FROM APD As Tmp 
    WHERE tmp.MostRecent=-1 AND tmp.OilWell=-1 
    GROUP BY tmp.Api HAVING Count(tmp.Api)>1))
ORDER BY APD.Api DESC;

【讨论】:

  • 这个运行;但是,它为我提供了 MostRecent 不等于 -1 且不重复的 API 的记录。即,当满足问题中描述的标准时,我需要输出显示 2 个(或更多)结果。 HTH。
  • 为什么?如果只有一个匹配结果怎么办?
【解决方案2】:

别名和表名让我有点困惑。如果你运行以下,你仍然得到同样的错误吗?

SELECT b.CompanyName
, a.Api
, a.ID
, a.MostRecent
, a.Project_Nu
, a.Unit_Lease
, a.Well_Nu
, a.OilWell
FROM APD a INNER JOIN BLMAPDCONTACT b
ON a.BLM_APD_Cont = b.OBJECTID
WHERE a.Api IN (
    SELECT tmp.Api 
    FROM APD As Tmp 
    WHERE tmp.MostRecent = -1 AND tmp.OilWell = -1 
    GROUP BY tmp.Api
    HAVING Count(tmp.Api) > 1
    )
ORDER BY a.Api DESC;

另外,请仔细检查我是否已正确地将表格转换为别名。

【讨论】:

  • 与上述相同的评论。
  • @KevinR.M.您将需要仔细检查表格/别名。您发送的代码、where 和 select 子句中的字段似乎引用了外部查询。我会为所有表设置别名,并确保引用它们的字段对您的用例有意义。如果之后您仍然看到问题,请发布更新后的查询和一些示例数据。
  • 仔细检查 - 您的表格和别名是正确的。使用此查询,我有(1 个或多个)不正确标准的结果: APD.Api = 111; APD.MostRecent = 0; APD.OilWell = -1 - 111 是唯一的,即不是重复的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 2020-05-10
  • 1970-01-01
相关资源
最近更新 更多