【问题标题】:SQL Server: order of returned rows when using IN clauseSQL Server:使用 IN 子句时返回行的顺序
【发布时间】:2013-11-11 07:36:29
【问题描述】:

运行以下查询将返回 4 行。正如我在 SSMS 中看到的,返回行的顺序与我在 IN 子句中指定的顺序相同。

SELECT * FROM Table WHERE ID IN (4,3,2,1)

我可以说返回行的顺序总是与它们在 IN 子句中出现的顺序相同吗?

如果是,那么以下两个查询是否以相同的顺序返回行? (因为我测试过订单是一样的,但我不知道我是否可以相信这种行为)

SELECT TOP 10 * FROM Table ORDER BY LastModification DESC

SELECT * FROM Table WHERE ID IN (SELECT TOP 10 ID FROM Table ORDER BY LastModification DESC)

我问这个问题是因为我有一个相当复杂的选择查询。使用这个技巧给我带来了大约。就我而言,性能提升了 30%。

【问题讨论】:

  • 不,订单不像inclause 中的那样得到保证。
  • 如果没有指定 order by 子句,我认为返回结果的顺序是基于主键列的
  • 我知道如果没有指定'order by',那么结果的顺序是不确定的,但是你能想象SQL Server在IN子句中以随机顺序处理值吗?在我的例子中,这个 ID 是主键
  • SQL server 根据需要处理记录;这甚至取决于物理文件布局。您应该永远假设任何隐式顺序 - 既不是按主键也不是按聚集索引。您的第二组查询可以以不同的顺序返回记录;但是,您可以向外部查询添加额外的“order by”。

标签: sql-server select in-clause


【解决方案1】:

除非您使用ORDER BY 子句,否则您不能保证记录按任何特定顺序排列。您可能会使用一些技巧,这些技巧在某些时候可能会奏效,但它们并不能保证您的订单。

【讨论】:

  • 我知道,选择查询确实如此。但我不确定 IN 子句是否也是如此,因为当您使用 IN 子句时,您明确定义了值的顺序,例如 'IN (4,3,2,1)'。
  • 无论您在IN (1,2,3,4)IN (4,3,2,1)IN 中的任何其他顺序,结果都可能以相同的顺序返回。
  • @user1640463:正如@Szymon 所说,按特定顺序获取记录的唯一保证方法是使用ORDER BY。您使用... IN (4,3,2,1) 的示例保证按该顺序返回行。如果你依赖它,当它不再起作用时,你迟早会遇到麻烦......
  • 很遗憾你是对的!似乎引擎按 PK 的顺序返回行(至少在我刚刚尝试过的测试中,这是不能保证的)。谢谢!
猜你喜欢
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多