Oracle
根據 2 列中的值生成行。漏洞?
我在 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 ...
編輯:我試過提示
MATERIALIZE
,INLINE
我的 Oracle 伺服器是 10g。
您的查詢中有錯誤。CTE
m
將不會返回單行,而是返回與 中一樣多的行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;