大师。我一直在处理我的问题,如果有任何帮助或建议,我将不胜感激。请检查这张照片。我不明白为什么我在底部查询中得到了错误的结果。正如您所看到的,与先前查询的区别仅在于"WHERE"子句,但这种区别必须导致相同的结果,因为它是一对一联接。重要的是v_last_part_info
是一个视图,我最近更改了它。我认为这是由于QEP缓存,但我尝试了OPTION (RECOMPLIE)
,甚至这里描述的解决方案。结果仍然是一样的。求你了,救命!我错过了什么?
附言:[OBJECT_ID]
是列名,不是内置的函数
附言:ANOTHER_DB有不同的排序规则,这就是我需要collate database_default
的原因
select Tracking
, SoItem
from v_last_part_info
where Tracking = '4170664293'
Tracking SoItem
4170664293 20
--================================================================================--
select
lpi.Tracking
, lpi.SoItem
from v_last_part_info lpi
join ANOTHER_DB..SO_HEADER h on lpi.Tracking = h.[OBJECT_ID] collate database_default
where Tracking = '4170664293'
Tracking SoItem
4170664293 20
--================================================================================--
select
lpi.Tracking
, lpi.SoItem
from v_last_part_info lpi
join ANOTHER_DB..SO_HEADER h on lpi.Tracking = h.[OBJECT_ID] collate database_default
where [OBJECT_ID] = '4170664293'
Tracking SoItem
4170664293 10
感谢GarethD,我找到了原因。这是因为v_last_part_info
内部的row_number()
函数。根据MSDN上的定义:
不能保证使用ROW_NUMBER()的顺序将与每次执行完全相同除非以下条件成立。
- 分区列的值是唯一的
- ORDER BY的值是唯一的
- 分区列和ORDERBY列的值的组合是唯一的
在我的情况下,选项2没有得到保障。