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

标签 mysql sql-server database oracle

存在以下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/

相关文章:

sql - 具有分析功能的数据的层次关系

MYSQL 错误 1052 问题 - 不确定为什么这是错误的

mysql - 如何获取各个表中使用的所有列?

php - 使用文件系统的图像库,描述存储在数据库中

sql - 如何使用 Sql 服务器中另一个表中的值的条件来更新表中的值

sql-server - SSIS 数据转换字符串到时间戳

php - 实时战略游戏如何在 PHP 中运行?

java - 如何使用 Play! 访问开发数据库框架?

mysql - MySQL 中的 Zerofill 有什么好处?

mysql - 如何更改数据库的 MySQL 日期格式?