我们有多个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
每次在特定服务器上执行查询时,它都会给出一个随机顺序 - 它完全忽略了ORDER BY部分。
答案 0 :(得分:5)
您的查询有一个最终ORDER BY
子句:doctrine_rownum
。这是未确定值的列的别名:
ROW_NUMBER()
OVER (ORDER BY (SELECT 0)) AS doctrine_rownum
因此,结果的任何顺序都是正确的顺序。您的所有服务器都返回正确的结果。 Select isn't broken
PS。您在CTE中也有一个ORDER BY
,与最终订单无关,因为它不会对最终结果或doctrine_rownum
值施加任何顺序。
查询由doctrine
生成
无论此原则是什么,查询都是由学说错误地生成的。
答案 1 :(得分:-2)
添加OPTION (MAXDOP 1)
修复了该服务器上的订单。