Проблема, касающаяся порядка внутреннего соединения в SQL Server - PullRequest
1 голос
/ 27 февраля 2012

Рассмотрим одну таблицу tbl1 с ID и Name.Табличный параметр params с ID.

Мне нужно продублировать строки в tbl1, в которых ID содержится в params.Я пытаюсь вставить как это

insert into tbl1(Name,somevalues..) 
   select tbl1.Name, tbl1.somevalues..
   from @params p 
   inner join tbl1 on tbl1.ID=p.ID  -- here ID is identity (PK).

Но после вставки, обнаруживается, что порядок вставки отличается.Если я выполняю только запрос на выборку, он будет отображать идентификатор на основе @params (TVP).Но тот же запрос, который я использовал после вставки, будет выполняться по-другому.

порядок в TVP / Select Query - порядок при вставке с использованием Select Query - B

 A       B 
370294  370294
368702  368702
369157  368504
368914  368505
368505  368914
368504  369157
368508  368506
368506  368507
368507  368508
368912  368637
368637  368638
368638  368639
368639  368912
368915  368915
368641  368641

Там некоторые идентификаторыкоторые отличаются по порядку.

В чем будет проблема для другого заказа?

Как я могу вставить значения в том же порядке, что и в моем TVP?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 27 февраля 2012

Всегда: ORDER произвольный без ORDER BY.

Это означает, что даже если вы использовали ORDER BY для INSERT, более поздний SELECT не гарантированно вернется с этим заказом , если вы используете ORDER BY для SELECT.

Другими словами: нет никакого подразумеваемого или естественного порядка для таблицы или представления.
Вы можете иметь только определенный порядок с ORDER BY

Редактировать

Однако.Следует отметить, что ВНУТРЕННИЕ СОЕДИНЕНИЯ являются как коммутативными, так и ассоциативными.То есть вы получаете такие же результаты.Вы спрашиваете об ORDER, на который я ответил выше

Подробнее см.

1 голос
/ 27 февраля 2012

Вы не должны полагаться на порядок вставки в ваших SELECT запросах.Используйте условие ORDER BY в конце SELECT, чтобы определить порядок упорядочения результатов.

...