得出错误的结果,特别是" WHERE"条件

时间:2015-12-10 11:29:40

标签: sql-server tsql

大师。 我坚持我的问​​题,并将感谢任何帮助或建议。请检查this pic。 我不明白为什么我在底层查询中得到错误的结果。正如您所看到的,与previuos查询的区别仅在于" WHERE"条款,但这种差异必须导致相同的结果,因为它是一对一的连接。 重要的是,v_last_part_info是一个视图,我最近更改了它。我认为这是由于QEP缓存,但我尝试OPTION (RECOMPLIE)甚至解决方案描述here。结果仍然相同。 请帮忙!我错过了什么?

P.S。:[OBJECT_ID]是列名,不是内置函数

P.P.S: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

1 个答案:

答案 0 :(得分:0)

感谢GarethD我发现了原因。这是因为row_number()内的v_last_part_info函数。在MSDN上的definition

  

无法保证查询返回的行使用   每次执行时,ROW_NUMBER()的排序方式都完全相同   除非以下条件成立。

     
      
  1. 分区列的值是唯一的。
  2.   
  3. ORDER BY的值是唯一的。
  4.   
  5. 分区列和ORDER BY列的值组合是唯一的。
  6.   

在我的情况下,选项2没有安全保障。