SQL ROW 子查询中比较的顺序定义?

Posted

技术标签:

【中文标题】SQL ROW 子查询中比较的顺序定义?【英文标题】:order definition for comparisons in SQL ROW subqueries? 【发布时间】:2016-04-07 01:19:32 【问题描述】:

我想知道何时使用比较运算符(例如 >>=)执行行子查询,比较顺序是使用字典(即字典)顺序定义还是按元素定义?

也就是说,对于ROW (A, B),应该

(79, 48) > (75, 52) 

WHERE 子句的行查询中是TRUE(字典)还是FALSE(元素方式)?

我在 PostgreSQL 中对此进行了测试,似乎它使用的是字典顺序,即 (79, 48) > (75, 52)TRUE,因为 79 > 75 和第二个组件因此无关紧要。环顾四周,似乎 mysql 也是如此:MySQL row subquery comparison issue,而 MySQL 文档似乎在这一点上令人困惑。搜索postgresql row subquery 并没有显示太多关于比较顺序的信息。

虽然字典顺序从计算机科学的角度来看是有意义的,但对于数据库用户来说可能看起来有点奇怪,因为行的顺序现在取决于 您在 SQL 中首先列出的列。例如,使用字典顺序,我们应该有:

 (52, 75) > (48, 79)  

ROW (B,A)。比较相同的行,顺序正好相反,因为列 B 列在最前面。

我的问题是:

这种行为(在行查询中使用字典顺序)是来自 SQL 标准/跨供应商还是特定于实现?有这方面的参考吗?

【问题讨论】:

【参考方案1】:

这在 Postgres 手册的 Row Constructor Comparison 章节中有记录:

对于<<=>>= 情况,比较行元素 从左到右,一旦有不相等或为空的元素对就停止 被发现。如果这对元素中的任何一个为空,则结果 行比较未知(空);否则比较这个 一对元素决定结果。例如,ROW(1,2,NULL) < ROW(1,3,0) 产生 true,而不是 null,因为第三对元素 不考虑。

还有:

注意:在 PostgreSQL 8.2 之前,<<=>>= 案例不 根据 SQL 规范处理。像ROW(a,b) < ROW(c,d) 这样的比较 被实现为a < c AND b < d,而正确的行为是 相当于a < c OR (a = c AND b < d)

这阐明了现代 Postgres 的行为符合 SQL 标准。

这与SELECT 查询的ORDER BY 子句中的逻辑基本相同:从左到右比较项目,直到找到第一个不等式 - 除了 NULL 值,它排序 last默认升序。

相关:

SQL syntax term for 'WHERE (col1, col2) < (val1, val2)'

【讨论】:

以上是关于SQL ROW 子查询中比较的顺序定义?的主要内容,如果未能解决你的问题,请参考以下文章

sql Prev / Next row - mysql select - 变量,corelated子查询

SQL 子查询, 如何按照IN的顺序查询

SQL Join与子查询计算不同表中具有相同ID的记录数

从 SQL SELECT 中的子查询和 ROW_NUMBER 窗口函数生成“平均”列

where条件放在子SQL语句中是否查询速度更快?

如何将带有子选择的 SQL 查询转换为 MDX 查询?