gpt4 book ai didi

mysql - mySql 与 Ms-Sql 和 Oracle 在连接具有排序结果集的表时的不同行为

转载 作者:可可西里 更新时间:2023-11-01 07:58:26 24 4
gpt4 key购买 nike

存在以下2个表:

T1:

 ---------------
| Id | Name |
---------------
| 1 | One |
| 2 | Two |
| 3 | Three |
---------------

T2:

 ----------------------
| Id | Name | T1Id |
----------------------
| 6 | X | 3 |
| 7 | Y | 2 |
| 8 | Z | 1 |
----------------------

表 1 (T1) 的主键列“Id”的值为 1、2 和 3。表二 (T2) 具有与 T1 表相关的主键列“Id”和“T1Id”外键列。我正在尝试执行以下 SQL 命令:

SELECT * FROM (SELECT * FROM T1 ORDER BY Id ASC) AS Tmp
INNER JOIN T2 ON Tmp.Id = T2.Level1Id

我想知道,虽然第一行试图对 T1 进行排序,然后连接到 T2,但结果集未排序,其他 DBMS(如 Ms-SQL 或 Oracle)会这样做。结果集为:

结果:

 ----------------------------------------
| Id | Name | Id | T1Id | Name |
----------------------------------------
| 3 | Three | 6 | 3 | X |
| 2 | Two | 7 | 2 | Y |
| 1 | One | 8 | 1 | Z |
----------------------------------------

为什么会这样,原因是什么?

最佳答案

SQL 标准明确指出,如果您未为其指定 ORDER BY,则结果集不需要按任何特定顺序排列。

子选择或连接输入上的任何“中间”ORDER BY 都没有影响,可以忽略。

没有指定的顺序,数据库可以自由选择最有效的顺序来实现。在某些情况下,这可能与连接输入之一的顺序相同(在嵌套循环连接的情况下,它自然会以这种方式出现),但您不能依赖于此。

因此,如果您想以定义的顺序获得结果,则必须将 ORDER BY 放在最顶层的 SELECT 语句中。

关于mysql - mySql 与 Ms-Sql 和 Oracle 在连接具有排序结果集的表时的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33853744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com