Порядок презентации внутреннего самосоединения

Если у меня есть таблица следующим образом:

+------+-------+   
| 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
+------+-------+------+-------+    

т.е. Я ожидал, что каждая строка в левой части будет повторяться для каждой строки в поездке. Происходит обратное. т.е. кажется, что он берет все строки и сопоставляет их с первой в правой части соединения.
Почему такой порядок?


person Cratylus    schedule 18.04.2013    source источник


Ответы (2)


У вас не должно быть никаких ожиданий относительно порядка результатов в запросе, если только вы не используете предложение order by (или в MySQL предложение group by).

К сожалению, я не нашел ссылку в документации MySQL, которая явно говорит об этом. Наиболее близкой является эта цитата здесь:

Вы могли заметить в предыдущих примерах, что строки результатов отображаются в произвольном порядке. Часто бывает легче исследовать выходные данные запроса, когда строки отсортированы каким-либо осмысленным образом. Чтобы отсортировать результат, используйте предложение ORDER BY.

Однако стандарт ANSI указывает, что результаты запроса (и таблицы) неупорядочены, за исключением случаев, когда указано предложение order by.

person Gordon Linoff    schedule 18.04.2013
comment
Я понимаю, что вы имеете в виду, но концептуально я имел в виду линейное сканирование таблицы слева и параллельное сканирование таблицы справа. Кажется, это делается наоборот. Мне было интересно, почему. - person Cratylus; 19.04.2013
comment
@Кратилус. . . SQL по большей части является описательным языком. То есть он указывает на желаемые результаты, а не на то, как их получить. Механизм SQL — это черный ящик, который возвращает эти результаты. В этом случае движок решил перевернуть две стороны соединения относительно того, что вы ожидаете. Чтобы понять этот и другие методы оптимизации, вам необходимо изучить детали конкретной базы данных. - person Gordon Linoff; 19.04.2013
comment
Это моя идея, или большинство учебников не подразумевают порядок, который я ожидал? - person Cratylus; 19.04.2013
comment
@Кратилус. . . Не могу говорить за других авторов. Все, что я написал о SQL, подчеркивает, что таблицы и запросы производят неупорядоченные наборы результатов. Легко спутать понимание алгоритмов с результатами запроса. К сожалению, вы не узнаете о хэш-соединениях, объединениях слиянием, параллельных хэш-соединениях и других методах соединений во вводном учебнике по SQL (не то чтобы они обязательно использовались в MySQL). - person Gordon Linoff; 19.04.2013

Думайте о таблицах как о наборах записей. Я говорю "множества", потому что обычно это допустимое слово в дальнем родственнике 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
person Mosty Mostacho    schedule 18.04.2013