在SQL Server中,在具有聚簇索引的表上使用时,默认情况下是TOP确定性的吗?

Jas*_*son 5 sql sql-server

所以我试图向一些人解释为什么这个查询是个坏主意:

SELECT z.ReportDate, z.Zipcode, SUM(z.Sales) AS Sales,
COALESCE(
  (SELECT TOP (1) GroupName
  FROM dbo.zipGroups
  WHERE (Zipcode = z.Zipcode)), 'Unknown') AS GroupName,
COALESCE(
  (SELECT TOP (1) GroupCode
  FROM dbo.zipGroups
  WHERE (Zipcode = z.Zipcode)), 0) AS GroupNumber
FROM dbo.Report_ByZipcode AS z
GROUP BY z.ReportDate, z.Zipcode
Run Code Online (Sandbox Code Playgroud)

并建议一个更好的方式来写它,当我的老板结束讨论时,"嗯,它已经返回了去年的正确数据,我们没有遇到任何问题,所以没关系."

在这一点上,我想,在世界上,甚至可能是什么?

经过一番挖掘,我发现了这些事实:

  1. 此查询应按Zipcode和date对销售进行分组,并将这些内容链接到ZipGroup分配给ZipGroups表的最大组(按人口大小).
  2. 每个Zipcode可以分配到0到多个组,如果Zipcode被分配到0个组,它就不在zipGroups表中.
  3. A组是地理区域,GroupNumbers按人口从最大到最小排名(例如,覆盖NY-NJ-CT三态区域的组是GroupNumber 1,而North Platte,Nebraska是GroupNumber 209).
  4. zipGroups表至少在2年内没有变化.
  5. zipGroups表有一个聚集索引,Zipcode,GroupNumber(升序)作为键.
  6. Zipcode,GroupNumber的组合在zipGroups中是唯一的.

所以我的问题有2个部分.

A)即使SELECT TOP查询中没有ORDER BY子句,它们实际上是确定性的,因为聚簇索引基本上是为它提供默认的ORDER BY吗?

B1)如果这是真的,那么查询是否会岌岌可危,实际上正在做它应该做的事情?

B2)如果不是这样,你能帮我证明一下吗?

注意:我已经重写了这个以使用连接,所以我不需要SQL来修复它,我需要将它投入生产中,所以我不再担心它会破坏.

Mar*_*tos 5

在没有ORDER BY的情况下,SQL Server不保证记录的顺序.它可能产生正确的结果999,999次,然后在第一百万次尝试失败.不要这样做.