内部自我加入的呈现顺序

时间:2013-04-18 20:11:21

标签: mysql sql join self-join

如果我有一张表格如下:

+------+-------+   
| sno  | cno   |  
+------+-------+  
|    1 | CS112 |  
|    1 | CS113 |  
|    1 | CS114 |  
|    2 | CS112 |  
|    3 | CS112 |  
|    3 | CS114 |  
|    4 | CS112 |  
|    4 | CS113 |  
|    5 | CS113 |  
|    6 | CS113 |  
|    6 | CS114 |  
+------+-------+  

如果我在sno上进行内部自我加入,我希望按以下顺序查看行:

+------+-------+------+-------+  
| sno  | cno   | sno  | cno   |  
+------+-------+------+-------+  
|    1 | CS112 |    1 | CS112 |  
|    1 | CS112 |    1 | CS113 |  
|    1 | CS112 |    1 | CS114 |  
|    1 | CS113 |    1 | CS112 |  
|    1 | CS113 |    1 | CS113 |  
|    1 | CS113 |    1 | CS114 |  
etc
+------+-------+------+-------+    

但顺序是

+------+-------+------+-------+  
| sno  | cno   | sno  | cno   |  
+------+-------+------+-------+  
|    1 | CS112 |    1 | CS112 |   
|    1 | CS113 |    1 | CS112 |  
|    1 | CS114 |    1 | CS112 |  
|    1 | CS112 |    1 | CS113 |  
|    1 | CS113 |    1 | CS113 |  
|    1 | CS114 |    1 | CS113 |  
|    1 | CS112 |    1 | CS114 |  
etc
+------+-------+------+-------+    

即。我希望看到左侧的每一行都要重复骑行中的每一行。相反的情况发生了即它似乎占用所有行并将其与连接右侧的第一行匹配 为什么订单是这样的?

2 个答案:

答案 0 :(得分:2)

除非您使用order by子句(或在MySQL中,group by子句),否则您对查询中的结果顺序不应该有任何期望。

不幸的是,我没有在MySQL文档中找到显式这样说的引用。最接近的是这句话here

  

您可能已在前面的示例中注意到结果行   按特定顺序显示。通常更容易检查   以某种有意义的方式对行进行排序时的查询输出。排序   结果,使用ORDER BY子句。

但ANSI标准确实指定查询结果(和表)是无序的,除非指定了order by子句。

答案 1 :(得分:1)

将表视为记录集。我说“设置”因为它通常是一个名为Relational Algebra的SQL表兄弟中的有效单词。当然,没有订单。

添加order by子句后,您将按指定的顺序获得结果:

select t1.sno, t1.cno, t2.sno, t2.cno from t t1
join t t2 on t1.sno = t2.sno
order by t1.sno, t2.sno, t1.cno, t2.cno