加入和分组依据 - 选择列表中的列无效

Posted

技术标签:

【中文标题】加入和分组依据 - 选择列表中的列无效【英文标题】:Join & Group By - Column is invalid in the select list 【发布时间】:2021-08-20 12:56:04 【问题描述】:

我正在运行查询以连接 2 个表,然后按 2 个字段对行进行分组,并从这些组中选择具有最小 ID 的行,但出现错误。连接的表如下所示:

+--------+---------+-----------------+-----------+-----------+
|   ID   |  CODE   |      NAME       | VRACHAR01 | VRACHAR02 |
+--------+---------+-----------------+-----------+-----------+
| 290861 | 1110896 | PRODUCT NAME XX |       001 |       706 |
| 290864 | 1110899 | PRODUCT NAME XX |       001 |       706 |
| 290865 | 1110900 | PRODUCT NAME XX |       003 |       721 |
| 290870 | 1110905 | PRODUCT NAME XX |       004 |       743 |
| 290871 | 1110906 | PRODUCT NAME XX |       004 |       743 |
| 290878 | 1110913 | PRODUCT NAME XX |       006 |       806 |
| 290879 | 1110914 | PRODUCT NAME XX |       007 |       807 |
| 290908 | 1110943 | PRODUCT NAME XX |       008 |       815 |
+--------+---------+-----------------+-----------+-----------+

如果我运行下面的脚本按最后 2 个字段对结果进行分组,我会收到错误:

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

    SELECT
        min(A.ID),
        A.CODE, 
        A.NAME, 
        B.VARCHAR01, 
        B.VARCHAR02
    FROM
        PRODUCTS A
    INNER JOIN
        EXTRAS B 
      ON 
        A.ID = B.ID
    WHERE
        A.COMPANY = 1002
    AND
        A.TYPE = 50
    GROUP BY
        B.VARCHAR01,
        B.VARCHAR02

感谢任何帮助。

【问题讨论】:

(1) 错误似乎很明显; group by 列与 select 列不一致。你有什么不明白? (2)你想完成什么?这还不清楚。 (3) 你用的是什么数据库? 【参考方案1】:

如果你想要最小 id,那么你不需要其他列:

SELECT MIN(P.ID), E.VARCHAR01, E.VARCHAR02
FROM PRODUCTS P INNER JOIN
     EXTRAS E
     ON P.ID = E.ID
WHERE P.COMPANY = 1002 AND P.TYPE = 50
GROUP BY E.VARCHAR01, E.VARCHAR02;

请注意,这会将无意义的表别名替换为表名的缩写。

如果你想要整行,那么你可以使用窗口函数:

SELECT PE.*
FROM (SELECT P.*, E.VARCHAR01, E.VARCHAR02,
             ROW_NUMBER() OVER (PARTITION BY E.VARCHAR01, E.VARCHAR02 ORDER BY P.ID ASC) as seqnum
      FROM PRODUCTS P INNER JOIN
           EXTRAS E
           ON P.ID = E.ID
      WHERE P.COMPANY = 1002 AND P.TYPE = 50
     ) PE
WHERE seqnum = 1;

【讨论】:

谢谢,第一个解决方案正是我想要的。

以上是关于加入和分组依据 - 选择列表中的列无效的主要内容,如果未能解决你的问题,请参考以下文章

不仅仅是另一个“选择列表中的列无效”错误

即使字段包含在分组依据列表中,分组依据或聚合错误

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

在 SQL 中使用 Group By 和 Aggregate - 获取错误“选择列表中的列无效,因为它不包含在聚合函数或 GROUP BY 中”

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

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