栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

将SELECT DISTINCT ON查询从Postgresql转换为MySQL

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

将SELECT DISTINCT ON查询从Postgresql转换为MySQL

没有将使用SELECt DISTINCT ON的Postgresql查询转换为MySQL的完全等效的方法。

PostgreSQL的选择DISTINCT ON

在Postgresql中,以下查询将消除表达式

(col1, col2, col3)
匹配的所有行,并且将仅为每组匹配的行保留“第一col4,col5行”:

SELECT DISTINCT ON (col1, col2, col3) col4, col5FROM tablename

因此,如果您的表格是这样的:

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

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

col4 | col5-----------777  | 888555  | 555

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

SELECt DISTINCT ON (col1, col2, col3) col4, col5FROM tablenameORDER BY col1, col2, col3, col4

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

MySQL对GROUP BY的扩展

MySQL扩展了GROUP BY的使用,以便我们可以选择未在GROUP
BY子句中命名的非聚合列。每当我们选择非聚合列时,服务器都可以从该列的每个组中自由选择任何值,因此结果值将是不确定的。

所以这个Postgresql查询:

SELECt DISTINCT ON (col1, col2, col3) col4, col5FROM tablename

可以认为等同于以下MySQL查询:

SELECt col4, col5FROM tablenameGROUP BY col1, col2, col3

Postgresql和MySQL都将为每个(col1,col2,col3)返回“第一行”,在两种情况下,返回的行都是不可预测的,因为我们没有指定by
order子句并对其进行排序。

很多人会很想使用ORDER BY转换此Postgresql查询:

SELECt DISTINCT ON (col1, col2, col3) col4, col5FROM tablenameORDER BY col1, col2, col3, col4

与此:

SELECt col4, col5FROM (  SELECt col1, col2, col3, col4, col5  FROM tablename  ORDER BY col1, col2, col3, col4) sGROUP BY col1, col2, col3

这里的想法是将ORDER BY应用于子查询,以便当MySQL按col1,col2,col3分组时,它将保留col4和col5的第一个遇到的值。
这个主意不错,但这是错误的! MySQL可以自由选择col4和col5的任何值,我们不知道遇到的第一个值,它取决于优化程序。因此,我将其更正为:

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

但这开始变得越来越复杂。

结论

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/416590.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号