2016-04-01 10 views
0

Bunu Oracle 11g'de nasıl yapabilirim?SQL - Diğer hesaplanan sütundaki bir sütuna bağlı olan bir düzeyi nasıl kullanabilirim?

Burada sorun, DUAL sorgusunun APP tablosunu tanımıyor olmasıdır.

SELECT APP_VER || SUBVERSION.LEVEL 
    FROM APP, 
     (SELECT LEVEL 
      FROM DUAL 
     CONNECT BY LEVEL < APP.NUM_SUBVERSIONS) SUBVERSION 
+1

ben soruyu anlamadım. Ne tür sonuçlar almaya çalıştığınıza emin değilim - örnek verisi gönderiyor ve beklenen çıktılar güzel olurdu. Tahminimce, her satırın "num_subversions" zamanını tekrarlamasına neden oluyorsunuz? –

cevap

0

her Possibile subvesion için bir satır ihtiyaç olduğunu varsayarsak, aşağıdaki gibi bazı yuvalama ile sorunu önleyebilirsiniz:

select APP_VER , NUM_SUBVERSIONS, subversions.num 
from app app 
inner join 
      (select level num 
       from dual 
       connect by level <= (select max(num_subversions) from app) 
      ) subversions 
    on (subversions.num <= num_subversions) 

Bu, sizin tabloları daha tarama gerektirir, bundan dolayı olmayabilir verimli olun, ancak, tablo ve sütunlarınızın isimlerinden, işlemek için çok fazla kayıt olmadığınızı varsayalım. Doğru sorununuzu anlasalardı

0

, bunu yapmak için subquerying ile özyinelemeli kullanabilirsiniz:

with a1 (app_ver, num_subversions, lvl) as (
select app_ver, num_subversions, 1 
    from app 
union all 
select app.app_ver, app.num_subversions, a1.lvl + 1 
    from app, a1 
where app.app_ver = a1.app_ver 
     and a1.lvl < app.num_subversions) 
search depth first by app_ver, num_subversions set my_order 
select app_ver || lvl 
    from a1; 

Numune yürütülmesine:

SQL> create table app as 
    2 with app (app_ver, num_subversions) as (
    3 select 'A', 2 from dual union all 
    4 select 'B', 3 from dual union all 
    5 select 'C', 4 from dual 
    6 ) 
    7 select app_ver, num_subversions 
    8 from app a; 
Table created 
SQL> with a1 (app_ver, num_subversions, lvl) as (
    2 select app_ver, num_subversions, 1 
    3 from app 
    4 union all 
    5 select app.app_ver, app.num_subversions, a1.lvl + 1 
    6 from app, a1 
    7 where app.app_ver = a1.app_ver 
    8   and a1.lvl < app.num_subversions) 
    9 search depth first by app_ver, num_subversions set my_order 
10 select app_ver || lvl 
11 from a1; 
APP_VER||LVL 
----------------------------------------- 
A1 
A2 
B1 
B2 
B3 
C1 
C2 
C3 
C4 
9 rows selected