2016-10-10 14 views
0

開始日と終了日からconnect byを使用すると、その範囲内のすべての日付を選択できます。しかし、これを複数の開始日と終了日に一般化するのに問題があります。ここで(代わりに、日付の数字を使用して)簡単な例です:接続を使用して複数の値の範囲を生成する際に問題が発生する

select 
    name, 
    min + level 
from (
    select 'foo' as name, 0 as min, 5 as max from dual 
    union all 
    select 'bar' as name, 10 as min, 20 as max from dual 
) 
connect by nocycle 
    (prior name = name) and level <= (max - min); 

私は15行を取得するために期待されるが、代わりに私が唯一2.クエリを簡素化取得:

select 
    name, 
    min + level 
from (
    select 'foo' as name, 0 as min, 5 as max from dual 
) 
connect by nocycle 
    level <= (max - min); 

私は5行を取得、 予想通り。しかし、次は一つだけを返します。

select 
    name, 
    min + level 
from (
    select 'foo' as name, 0 as min, 5 as max from dual 
) 
connect by nocycle 
    (prior name = name) and level <= (max - min); 

、どういうわけか、以下のとおりん:ここで何が起こっている

select 
    name, 
    min + level 
from (
    select 'foo' as name, 0 as min, 5 as max from dual 
) 
connect by nocycle 
    (prior name = name or 1=1) and level <= (max - min); 

、そしてどのように私はそれを解決するのですか?

答えて

1

対策:connect by nocycleを使用しないでください。サイクルを中断するには、PRIORで条件を1つ追加します。これにより、各行に固有の追加(システム提供)列が強制的に適用されます。標準は... and prior sys_guid() is not null

説明:よりむしろ車輪の再発明、https://community.oracle.com/thread/2526535

は、最初のクエリの書き換え:

select 
    name, 
    min + level 
from (
    select 'foo' as name, 0 as min, 5 as max from dual 
    union all 
    select 'bar' as name, 10 as min, 20 as max from dual 
) 
connect by prior name = name and level <= max and prior sys_guid() is not null; 
+0

@thomsmithを - 私はあなたがC#の開発者とすることができ、必要ないかもしれないあなたのプロフィールからご覧くださいOracle SQLの微妙な/奇妙なことに気を配ります。もしそうなら、 '... and prior sys_guid()is not null'トリック(' nocycle'なし)を使い、それがどうやって、なぜ、どうして、なぜ必要なのか心配しないでください。それが広く使われていることを知っているだけで、あなたがしようとしていたことを正確に行います。 – mathguy

関連する問題