我有一个简单的选择语句。它基本上是2个CTE,其中一个包含ROW_NUMBER()OVER(PARTITION BY,然后将它们从这两个表联接到另外4个表中。没有任何功能或异常之处。
WITH Safety_Check_CTE AS
(
SELECT
Fact_Unit_Safety_Checks_Wkey,
ROW_NUMBER() OVER (PARTITION BY [Dim_Unit_Wkey], [Dim_Safety_Check_Type_Wkey]
ORDER BY [Dim_Safety_Check_Date_Wkey] DESC) AS Check_No
FROM
[Pitches].[Fact_Unit_Safety_Checks]
), Last_Safety_Check_CTE AS
(
SELECT
Fact_Unit_Safety_Checks_Wkey
FROM
Safety_Check_CTE
WHERE
Check_No = 1
)
SELECT
COUNT(*)
FROM
Last_Safety_Check_CTE lc
JOIN
Pitches.Fact_Unit_Safety_Checks f ON lc.Fact_Unit_Safety_Checks_Wkey = f.Fact_Unit_Safety_Checks_Wkey
JOIN
DIM.Dim_Unit u ON f.Dim_Unit_Wkey = u.Dim_Unit_Wkey
JOIN
DIM.Dim_Safety_Check_Type t ON f.Dim_Safety_Check_Type_Wkey = t.Dim_Safety_Check_Type_Wkey
JOIN
DIM.Dim_Date d ON f.Dim_Safety_Check_Date_Wkey = d.Dim_Date_Wkey
WHERE
f.Safety_Check_Certificate_No IN ('GP/KB11007') --option (maxdop 1)
有时它返回0、1或2行。结果显然应该是一致的。
我在复制问题时运行了配置文件跟踪,而我的会话是数据库中唯一的会话。
我已经比较了实际执行计划,它们都相同,除了最终的哈希匹配返回的行数不同。
如果我使用MAXDOP 0,则无法复制。
答案 0 :(得分:1)
如果您使用我的评论作为答案。
我的猜测是,ORDER BY [Dim_Safety_Check_Date_Wkey]不确定。
答案 1 :(得分:1)
在CTE中,您发现对于任何给定的[Dim_Unit_Wkey],[Dim_Safety_Check_Type_Wkey]组合,与最近发送的行相关联的[Fact_Unit_Safety_Checks_Wkey] ...无论天气如何,[Safety_Check_Certificate_No]都等于'GP / KB11007”。
然后,在外部查询中,您正在基于[Safety_Check_Certificate_No] ='GP / KB11007'过滤结果。
因此,除非最新的[Fact_Unit_Safety_Checks_Wkey]碰巧具有[Safety_Check_Certificate_No] ='GP / KB11007',否则数据将被过滤掉。