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部分.
你的查询有一个最后的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生成
无论这个学说是什么,都会通过学说错误地生成查询.