在使用排序结果集加入表时,mySql的不同行为与Ms-Sql和Oracle相比

Var*_*yee 3 mysql database sql-server oracle

存在以下2个表:

T1:

 ---------------
|  Id  |  Name  |
 ---------------
|  1   |  One   |
|  2   |  Two   |
|  3   |  Three |
 ---------------
Run Code Online (Sandbox Code Playgroud)

T2:

 ----------------------
|  Id  |  Name  | T1Id |
 ----------------------
|  6   |   X    |   3  |
|  7   |   Y    |   2  |
|  8   |   Z    |   1  |
 ----------------------
Run Code Online (Sandbox Code Playgroud)

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

SELECT * FROM (SELECT * FROM T1 ORDER BY Id ASC) AS Tmp
INNER JOIN T2 ON Tmp.Id = T2.Level1Id
Run Code Online (Sandbox Code Playgroud)

我想知道虽然第一行尝试命令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    |
 ----------------------------------------
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况,原因是什么?

Thi*_*ilo 6

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

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

如果没有指定的顺序,数据库可以自由选择最有效的订单.在某些情况下,这可能与其中一个连接输入的顺序相同(在嵌套循环连接的情况下,它会自然地出现),但您不能依赖它.

因此,如果您希望以定义的顺序获得结果,则必须将其ORDER BY置于最顶层的SELECT语句中.