微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将SELECT DISTINCT转换为Postgresql到MySQL的查询

我一直在使用Postgresql,现在正在迁移到 MySQL.

在我的查询中,我使用Postgresql的SELECT disTINCT ON(col1,col2,col3),我想知道MysqL中是否有任何对应的这个语句.

没有完全相同的方式将使用SELECT disTINCT ON的PostgreSQL查询转换为MysqL.

Postgresql SELECT disTINCT ON

在Postgresql中,以下查询将消除表达式(col1,col3)匹配的所有行,并且它将只保留每组匹配行的“first col4,col5 row”:

SELECT disTINCT ON (col1,col3) col4,col5
FROM tablename

所以如果你的表是这样的:

col1 | col2 | col3 | col4 | col5
--------------------------------
1    | 2    | 3    | 777  | 888
1    | 2    | 3    | 888  | 999
3    | 3    | 3    | 555  | 555

我们的查询将只保留一行(1,2,3)和一行(3,3,3).结果行将是:

col4 | col5
-----------
777  | 888
555  | 555

请注意,每组的“第一行”是不可预测的,我们的第一行也可能是(888,999),除非我们指定了一个ORDER BY:

SELECT disTINCT ON (col1,col5
FROM tablename
ORDER BY col1,col3,col4

(表达式上的disTINCT必须与最左边的ORDER BY表达式匹配,但ORDER BY可以包含其他表达式).

MysqL扩展到GROUP BY

MysqL扩展了使用GROUP BY,以便我们可以选择GROUP BY子句中未命名的非集合列.每当我们选择非集合列时,服务器可以从该列中的每个组中选择任何值,因此结果值将被确定.

所以这个PostgreSQL查询

SELECT disTINCT ON (col1,col5
FROM tablename

可以认为相当于这个MySQL查询

SELECT col4,col5
FROM tablename
GROUP BY col1,col3

PostgresqlMysqL都将为每个(col1,col3)返回“第一行”,并且在这两种情况下,返回的行是不可预测的,因为我们没有指定和order by子句.

很多人会很乐意用ORDER BY转换这个PostgreSQL查询

SELECT disTINCT ON (col1,col4

用这个:

SELECT col4,col5
FROM (
  SELECT col1,col4,col5
  FROM tablename
  ORDER BY col1,col4
) s
GROUP BY col1,col3

这里的想法是将ORDER BY应用到子查询,以便当col1,col3的MysqL组将保留col4和col5的第一个遇到的值.这个想法很好,但是错了! MysqL可以自由选择col4和col5的任何值,我们不知道遇到的是第一个值,它取决于优化器.所以我会纠正这个:

SELECT t1.col4,t1.col5
FROM tablename t1 INNER JOIN (SELECT col1,MIN(col4) as m_col4
                              FROM tablename
                              GROUP BY col1,col3) s
     ON t1.col1=s.col1
        AND t1.col2=s.col2
        AND t1.col3=s.col3
        AND t1.col4=s.m_col4
GROUP BY
  t1.col1,t1.col2,t1.col3,t1.col4

但是这开始变得越来越复杂了.

结论

作为一般规则,没有一种将PostgreSQL查询转换为MySQL查询的确切方法,但是有很多解决方法,生成查询可能与原始查询一样简单,或者可能变得非常复杂,但这取决于查询本身.

原文地址:https://www.jb51.cc/postgresql/192604.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐