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)
为什么会发生这种情况,原因是什么?
SQL标准明确指出,如果您没有指定结果集,则结果集不需要按任何特定顺序排列ORDER BY.
子ORDER BY选择或连接输入上的任何"中间" 都没有影响,可以忽略.
如果没有指定的顺序,数据库可以自由选择最有效的订单.在某些情况下,这可能与其中一个连接输入的顺序相同(在嵌套循环连接的情况下,它会自然地出现),但您不能依赖它.
因此,如果您希望以定义的顺序获得结果,则必须将其ORDER BY置于最顶层的SELECT语句中.
| 归档时间: |
|
| 查看次数: |
46 次 |
| 最近记录: |