基于 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 的值的唯一(不同)结果。

不幸的是,该查询不适用于 H2DB2(它给出了 ...必须在 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 恰好支持这种语法,但它的语法被破坏了。 SELECTGROUP 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

r:按名称附加列子集的平均值