基于 MySQL、H2 和 DB2 列子集的具有唯一值的 SELECT
Posted
技术标签:
【中文标题】基于 MySQL、H2 和 DB2 列子集的具有唯一值的 SELECT【英文标题】:SELECT with unique values based on a subset of columns for MySQL, H2 and DB2 【发布时间】:2020-12-02 16:43:43 【问题描述】:我有以下在 MySQL 中运行良好的查询:
SELECT *
FROM mytable
GROUP BY col2, col3, col4, col5, col6
这允许我从 mytable
中选择所有基于多列 col2, col3, col4, col5, col6
的值的唯一(不同)结果。
不幸的是,该查询不适用于 H2 和 DB2(它给出了 ...必须在 GROUP BY 列表中... 错误),我正在寻找一种通用且高效的替代方案。
我也尝试过以下一种:
SELECT t1.col1, t1.col2, t1.col3, t1.col4, t1.col5, t1.col6
FROM mytable t1
JOIN (SELECT t2.col2, t2.col3, t2.col4, t2.col5, t2.col6
FROM mytable t2
GROUP BY t2.col2, t2.col3, t2.col4, t2.col5, t2.col6) x
ON x.col1 = t1.col1
AND x.col2 = t1.col2
AND x.col3 = t1.col3
AND x.col4 = t1.col4
AND x.col5 = t1.col5
AND x.col6 = t1.col6;
但它非常慢(尝试使用 Docker MariaDB 本地实例),特别是因为我将在 INSERT INTO ...
查询中使用 SELECT
,所以我需要一些高效的东西。
有什么帮助吗?
谢谢
【问题讨论】:
第二个查询的结果不等同于第一个查询的结果。如果启用了非标准 mysql 特定扩展,则第一个查询仅在 MySQL 中“正常工作”。 【参考方案1】:这不在 MySQL 中工作正常:
SELECT *
FROM mytable
GROUP BY col2, col3, col4, col5, col6
旧版本的 MySQL 恰好支持这种语法,但它的语法被破坏了。 SELECT
和 GROUP BY
子句不一致。幸好 MySQL 在过去几年发布的版本中不支持这种语法(使用默认配置)。
如果你想要每个组合一行,那么使用窗口函数或一些类似的方法:
select t.*
from (select t.*,
row_number() over (partition by col2, col3, col4, col5, col6 order by col2) as seqnum
from mytable t
) t
where seqnum = 1;
【讨论】:
哇,好用,谢谢!order by
是必需的还是建议的?
@Briston12,有些 DBMS 需要 order by 子句,有些则不需要。我在dbfiddle.uk/… 和 SQL-server 2019 进行了测试,Oracle 18c 需要订购。 Db2、MariaDB、MySQL、SQLlite、Postgres 无需 order by 即可正常工作
一个 ORDER BY 可以帮助语句具有确定性。 IE。如果您ORDER BY col1
,那么如果您有两行或更多行具有相同的 col2-6 值,您将获得具有最低 col1 值的行seqnum = 1
以上是关于基于 MySQL、H2 和 DB2 列子集的具有唯一值的 SELECT的主要内容,如果未能解决你的问题,请参考以下文章
SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase, Ha
异常 SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]
SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase(代码片
SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase] 错误
Mybatis运行错误:信息: SQLErrorCodes loaded: [DB2, Derby, H2, HDB, HSQL, Informix, MS-SQL, MySQL, Oracle, P