加入和分组依据 - 选择列表中的列无效
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 中”