有关SQL Server中内部联接顺序的问题

时间:2012-02-27 12:23:50

标签: sql-server sql-server-2008 tsql join inner-join

考虑使用tbl1ID的一个表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)的ID。但是我在插入后使用的相同查询将以不同的方式执行。

TVP中的订单/选择查询 - A. 使用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

有些ID在顺序上有所不同。

不同订单会出现什么问题?

如何按照与TVP相同的顺序插入值?

提前致谢。

2 个答案:

答案 0 :(得分:3)

始终:没有ORDER BY,ORDER是任意的。

这意味着即使您确实对INSERT使用了ORDER BY,也不能保证稍后的SELECT返回,除非在SELECT上使用ORDER BY。

换句话说:表或视图中没有隐含的自然顺序。
您只能使用ORDER BY

定义订单

修改

然而。应该注意的是,INNER JOIN既是可交换的又是关联的。也就是说,您获得相同的结果。你问的是我上面回答的ORDER

更多信息,请参阅

答案 1 :(得分:1)

您不应该依赖SELECT次查询的插入顺序。使用ORDER BY末尾的SELECT子句定义如何订购结果。