【问题标题】:Issue regarding the Order of Inner Join in SQL ServerSQL Server内部连接顺序问题
【发布时间】:2012-02-27 12:23:49
【问题描述】:

考虑一张表tbl1IDName。 一个表值参数paramsID

我需要复制 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 中相同的顺序插入值?

提前致谢。

【问题讨论】:

  • 除非您使用显式 ORDER BY,否则DBMS 没有 的排序概念。在您的情况下,使用 SQL Server,在您的表上添加聚集索引将在物理上保证该字段的顺序。
  • SQL Server 表没有隐含的顺序 - 只有明确指定 ORDER BY 子句才能得到有序的东西。
  • @marc_s 但是当单独在选择查询中时,它将按照 TVP 中的顺序返回结果。那么这怎么可能呢?
  • @Harie:如果您的SELECT 中没有ORDER BY - 任何订购均无保证。如果您需要订购 - 指定它 - 这是 ONLY 方式。

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


【解决方案1】:

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

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

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

编辑

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

有关更多信息,请参阅

【讨论】:

    【解决方案2】:

    您不应依赖SELECT 查询的插入顺序。使用SELECT 末尾的ORDER BY 子句定义结果的排序方式。

    【讨论】:

      猜你喜欢
      • 2018-05-06
      • 2021-12-10
      • 2010-11-23
      • 2017-07-31
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      相关资源
      最近更新 更多