SELECT 具有基于 MySQL、H2 和 DB2 的列子集的唯一值
SELECT with unique values based on a subset of columns for MySQL, H2 and DB2
我有以下查询,在 MySQL 中运行良好:
SELECT *
FROM mytable
GROUP BY col2, col3, col4, col5, col6
这允许我 select 来自 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:
中工作正常
SELECT *
FROM mytable
GROUP BY col2, col3, col4, col5, col6
MySQL 的旧版本碰巧支持这种语法,但它是错误的语法。 SELECT
和 GROUP BY
子句不一致。令人高兴的是 MySQL 在过去几年发布的版本中不支持这种语法(使用默认配置)。
如果您希望每个组合占一行,请使用 window 函数或一些类似的方法:
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;
我有以下查询,在 MySQL 中运行良好:
SELECT *
FROM mytable
GROUP BY col2, col3, col4, col5, col6
这允许我 select 来自 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:
中工作正常SELECT *
FROM mytable
GROUP BY col2, col3, col4, col5, col6
MySQL 的旧版本碰巧支持这种语法,但它是错误的语法。 SELECT
和 GROUP BY
子句不一致。令人高兴的是 MySQL 在过去几年发布的版本中不支持这种语法(使用默认配置)。
如果您希望每个组合占一行,请使用 window 函数或一些类似的方法:
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;