Oracle

根據 2 列中的值生成行。漏洞?

  • May 20, 2015

我在 Oracle 中有下表:

 ID     START  END
_ID01   AB050   AB100
_ID01   AB101   AB150
_ID02   AB0251  AB0300
_ID01   AB00301 AB00302

我想生成盡可能多的行和每個記錄定義。因此,第一個需要 50 個以上的新版本,從 AB50 開始,直到 AB100。一切正常但如果我不添加那個垃圾行,sql 開發人員無法解決問題,只需 載入.

我嘗試了一些隨機的 SQL 提示,但沒有一個起作用。需要一些建議或提示我的工作查詢有什麼“錯誤”,因為我認為這不是正常行為。

我的 SQL 查詢如下。

    with m as (
     select  to_number(substr(t.START,3)) as num
     from FCS_FP_TOMB t
     where t.START ='AB0251' --<--- THIS ROW IS A JUNK BUT DOESNT WORK WITHOUT IT
    ),
     n as (
     select level - 1 as n
     from m
     connect by level <= m.num + 1
    )
select  ft0.*, regexp_substr(ft0.START,'([A-Z])+')||to_char(to_number(substr(ft0.START,3)) + n.n) as "bizonylat"
from FCS_FP_TOMB ft0 join
    n
    on to_number(substr(ft0.START,3)) + n.n <= to_number(substr(ft0.END,3))

order by 2,3,7
    ;

輸出:

...
_ID01   AB050   AB100   AB098
_ID01   AB050   AB100   AB099
_ID01   AB050   AB100   AB100
_ID01   AB101   AB150   AB101
_ID01   AB101   AB150   AB102
...

編輯:我試過提示MATERIALIZEINLINE我的 Oracle 伺服器是 10g。

您的查詢中有錯誤。CTEm將不會返回單行,而是返回與 中一樣多的行FCS_FP_TOMB。然後,您將所有這些行放入行生成器 CTEn中,而像您正在使用的行生成器構造應該得到一行。

我要做的是定義m返回具有最小值和最大值的單行,然後將它們減去n以獲得您需要生成的行數。

類似(未經測試):

with m as (
 select max(to_number(substr(t.END,3))) - min(to_number(substr(t.START,3))) as num
 from FCS_FP_TOMB t
), n as (
 select level - 1 as n
 from m
 connect by level <= m.num + 1
)
select ft0.*, regexp_substr(ft0.START,'([A-])+')||to_char(to_number(substr(ft0.START,3)) + n.n) as "bizonylat"
from FCS_FP_TOMB ft0
join n on to_number(substr(ft0.START,3)) + n.n <= to_number(substr(ft0.END,3))
order by 2,3,7;

引用自:https://dba.stackexchange.com/questions/102027