一个MS SQL服务器返回错误的查询顺序

Mar*_*ata 0 sql-server sql-server-2008 doctrine-orm

我们有多个MSSQL服务器具有相同的数据库副本,下面的查询返回除一个以外的所有服务器的有效顺序,我仔细检查了表的设计,除了几个服务器缺少索引外,所有看起来都相同.

查询由doctrine生成

WITH dctrn_cte AS (
   SELECT TOP 10 a0_.Priority 
   FROM PROJECTS a0_ 
   WHERE a0_.ProjectID = 1234 
     AND (a0_.Check1 > 0 
          OR 
          a0_.Check2 > 0) 
     AND a0_.Active = 1 
   ORDER BY a0_.Priority DESC) 
   SELECT * 
   FROM (
      SELECT *, ROW_NUMBER() 
      OVER (ORDER BY (SELECT 0)) AS doctrine_rownum FROM dctrn_cte
      ) AS doctrine_tbl 
   WHERE doctrine_rownum BETWEEN 1 AND 10 ORDER BY doctrine_rownum ASC
Run Code Online (Sandbox Code Playgroud)

每次在该特定服务器上执行查询时,它都会给出一个随机顺序 - 它完全忽略了ORDER BY部分.

Rem*_*anu 5

你的查询有一个最后的ORDER BY条款:doctrine_rownum.这是未确定值的列的别名:

ROW_NUMBER() 
  OVER (ORDER BY (SELECT 0)) AS doctrine_rownum 
Run Code Online (Sandbox Code Playgroud)

因此,结果的任何顺序都是正确的顺序.您的所有服务器都返回正确的结果.选择没有打破.

PS.您还有ORDER BYCTE内部,与最终订单无关,因为它不会对最终结果或doctrine_rownum值施加任何顺序.

查询由doctrine生成

无论这个学说是什么,都会通过学说错误地生成查询.