0

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';

最終的に 2 つの結果が得られます。

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 機能である可能性があることを理解しています。

この奇妙な問題に光を当てていただければ幸いです。

4

1 に答える 1

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
于 2012-11-27T10:40:45.947 に答える