2012-11-27 38 views
0

当我将包含DENSE_RANK()的查询合并为IN子句的输入时,我遇到了一些奇怪的结果。与DENSE_RANK和IN的奇怪行为

为了证明我把它们分开了;

此查询

select * 
from ALL_QUOTE 
where ID in ('G002WMLS') 

返回1个结果:

ID  LongID StartDate EndDate 
G002WMLS 67888 01/10/2011 30/11/2011 

此查询

select ID 
from (

select LongId, ID, DENSE_RANK() over (partition by LongId order by end_date desc, substr(ID, 2, 7) desc, start_date desc) d 
from WithoutPD 
) 

where d = 1 and LongId = '67888' 

也返回1个结果:

ID 
G002WMLS 

但是当我结合在一起他们两个:

select * 
from ALL_QUOTE 
where ID in (

select ID 
from (

select LongId, ID, DENSE_RANK() over (partition by LongId order by end_date desc, substr(ID, 2, 7) desc, start_date desc) d 
from WithoutPD 
) 

where d = 1 

) 
and LongId = '67888'; 

我结束了两个结果:

ID  LongID StartDate EndDate 
G002MIMQ 67888 01/10/2010 30/09/2011 
G002WMLS 67888 01/10/2011 30/11/2011 

我简直不明白如何G002MIMQ被包含在结果中。我使用的是Oracle 11.2.0.1.0,但是我知道这可能是我误解的通用SQL功能。

希望你能对这个奇怪的问题有所了解。

回答

1

您已将and LongID='67888'移至子查询的where子句之外。

尝试此查询,而不是...

select * 
from ALL_QUOTE 
where ID in ( 
    select ID 
    from (  
     select LongId, ID, DENSE_RANK() over (partition by LongId order by end_date desc, substr(ID, 2, 7) desc, start_date desc) d 
     from WithoutPD   
    )   
    where d = 1 
    and LongId = '67888' 
); 

编辑

select 
    AllQuote.* 
from 
    AllQuote 
     inner join 
    (
     select ID 
     from (
      select LongId, ID, DENSE_RANK() over (partition by LongId order by end_date desc, substring(ID, 2, 7) desc, start_date desc) d 
      from WithoutPD 
     ) t 
     where d = 1 
     and LongId = '67888' 
    ) v 
     on AllQuote.ID = v.ID 
+0

我原本以为是问题太多,但我提取从该条款的所有结果,并使用Excel中只检查' G002WMLS'存在于结果中。 –

+0

数据集中是否有空值?如果用联接替换子查询中的'in'(请参阅上面的编辑),则查询是否可以工作 – podiluska

+0

没有空ID,如果我在子查询中加入IN,我会得到两个结果一样)。 –