Oracle連結行解析
回転:
http://www.ll19.com/log/2010/06/04/115.html
一つの仕事で出会ったORACLE連結行は、統合結果の並べ替えを記録します.もともとは簡単にwmsys.wm_を使うと思います.concat関数でいいです.結果は小さい問題が出ました.解決するのはまだ大変です.記録してください.
表ems_gwjk_dbcb_ロゴ部分の記録は以下の通りです.
SELECT * FROM eims_gwjk_dbcb_log t
選択した行に注意します.今はWFIDを基準に統合行の操作を行いたいですが、最初に使うのはwmsys.wm_です.concat関数は、結合行の動作を行います.
SELECT t.wfid,
wmsys.wm_concat(dbcb) AS dbcb ,
wmsys.wm_concat(tacheid) AS tacheid,
wmsys.wm_concat(tacheno) AS tacheno,
wmsys.wm_concat(senduserid) AS senduserid
FROM eims_gwjk_dbcb_log t GROUP BY t.wfid;
以下は合併後の結果です.選択した行と前の選択した4行を比較します.私の考えは統合行の後、結合行のフィールドを順番に並べ替えるべきです.
前に選択した行:
wfid
dbcb
テージid
tacheno
senduserid
85652
CB
000003005
3
U 75 CB 3
85652
CB
000003206
2
U 76 CB 2
85652
DB
000003206
2
U 76 DB 2
85652
DB
000003005
3
U 75 DB 3
統合後:
wfid
dbcb
テージid
tacheno
senduserid
85652
DB,DB,CB,CB
0000076,0000036,0000035,0000035,0000035
2,3,3,2
U 76 DB 2、U 75 CB 3、U 75 DB 3、U 76 CB 2
senduseridフィールドを通じて(実はこのフィールドの値はマージ後のフィールドの順序を検出するために変更されました.前のいくつかのフィールドの値に対応しています.)見られます.いくつかの連結行のフィールドの順序は完全に乱れていて、予想通りの結果に並べられていません.
並べ替え後にマージしても:
SELECT t.wfid,
wmsys.wm_concat(dbcb) AS dbcb ,
wmsys.wm_concat(tacheid) AS tacheid,
wmsys.wm_concat(tacheno) AS tacheno,
wmsys.wm_concat(senduserid) AS senduserid
FROM (SELECT * FROM eims_gwjk_dbcb_log ORDER BY wfid,dbcb,tacheid,tacheno,senduserid) t GROUP BY t.wfid;
順番も違います.それとも私はwmsys.wm_が使えません.concatという関数はどのように結合フィールドを並べ替えますか?とにかくたくさん検索しましたが、解決方法がありません.
仕方がない他の連結行の方法は、まずこの文を見ます.
SELECT wfid,dbcb,tacheid,tacheno,senduserid,
-- wfid senduserid
(row_number() over(partition BY wfid ORDER BY senduserid)) rn
FROM eims_gwjk_dbcb_log
同じ注釈では、wfidグループに従って、各グループのsenduseridが別名のRNを並べ替える.その後WFIDとRNによってsys_を使います.connect()by_パス関数はデータをマージします.
SELECT wfid,(substr(sys_connect_by_path(dbcb,','),2)) AS dbcb,
(substr(sys_connect_by_path(tacheid,','),2)) AS tacheid,
(substr(sys_connect_by_path(tacheno,','),2)) AS tacheno,
(substr(sys_connect_by_path(senduserid,','),2)) AS senduserid,
level AS curr_level
FROM(
SELECT wfid,dbcb,tacheid,tacheno,senduserid,
-- wfid senduserid
(row_number() over(partition BY wfid ORDER BY senduserid)) rn
FROM eims_gwjk_dbcb_log
)
connect BY wfid = prior wfid AND rn-1 = prior rn;
データの統合は再帰的合併に似ています.私たちはcurr_だけが必要です.レベルが一番高い行は、関連データのすべての行を統合した後の文です.
SELECT * FROM (
-- curr_level , , curr_level
SELECT wfid,dbcb,tacheid,tacheno,senduserid,
row_number() over(partition BY wfid ORDER BY wfid,curr_level DESC) c_level
FROM (
-- WFID RN sys_connect_by_path
SELECT wfid,(substr(sys_connect_by_path(dbcb,','),2)) AS dbcb,
(substr(sys_connect_by_path(tacheid,','),2)) AS tacheid,
(substr(sys_connect_by_path(tacheno,','),2)) AS tacheno,
(substr(sys_connect_by_path(senduserid,','),2)) AS senduserid,
level AS curr_level
FROM(
SELECT wfid,dbcb,tacheid,tacheno,senduserid,
-- wfid senduserid
(row_number() over(partition BY wfid ORDER BY senduserid)) rn
FROM eims_gwjk_dbcb_log
)
connect BY wfid = prior wfid AND rn-1 = prior rn
))
WHERE c_level = 1
データの並べ替えが正常です.==
個人的にはEASYの一つのことがこんなに複雑になっていると思っていますが、実はwmsys.wm_に対してもあります.concatの合併ソート方法は?少なくとも半日探しても見つけられませんでしたが、最後に使ったこの方法はやはり今後のデータの性能上の問題が多くなりました.
ついでに使用する関数をまとめます.
Start with...Connect By Start with...Connect By子文再帰クエリは、一般的にツリー構造を維持するための表のアプリケーションに使用されます.(すなわち再帰的クエリ)使用例として、試験データを挿入する
CREATE TABLE TBL_TEST
(ID NUMBER,
NAME VARCHAR2(100 BYTE),
PID NUMBER DEFAULT 0);
:INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');
、ロフトから末梢に再帰する(全「子孫」セットを取る):SELECT * FROM TBL_TEST
start WITH id=1
connect BY prior id = pid
ORDER BY pid
、末梢からツリーROOTに再帰する(すべての「父」セットを取る):SELECT * FROM TBL_TEST
start WITH id=5
connect BY prior pid = id
ORDER BY id
Group ByアグリゲーションステートメントGroup Byアグリゲーションステートメントは、関連するsum、max、minなどの関数に合わせて使用しなければならない:SELECT * FROM eims_gwjk_dbcb_log t
WHERE t.wfid = 85652
wfid=85652のtachenoの総和を計算します.SELECT wfid,sum(tacheno) FROM eims_gwjk_dbcb_log
WHERE wfid = 85652
GROUP BY wfid;
min maxは最大と最小値を取得します.SELECT max(senduserid) FROM eims_gwjk_dbcb_log
--U76DB2
SELECT min(senduserid) FROM eims_gwjk_dbcb_log
--U123
三つの「評価」関数これらの3つの分析関数は、各パケット内で1から並べ替えられます.
ROW_NUMBER()は重複値がないので、改ページ表示を利用しても良いです.
DENSE_RANK()は連続して並べ替えられていますが、2位がある時も3位につけています.
RANK()はジャンプ順序で、2番目がある場合は次の4番目(同様に各グループ内)です.
例:
SELECT tacheid,
(ROW_NUMBER() over(ORDER BY tacheid)) rn
FROM eims_gwjk_dbcb_log t
tacheck rn 0000000864 100001864万0001889万1889,0001911 5000000 1911,7000001911,8000001918,000019191918,SELECT tacheid,
(DENSE_RANK() over(ORDER BY tacheid)) rn
FROM eims_gwjk_dbcb_log t
tachedrn 000001864,1000001889,0001889,00001911,00001911,0000191918,30.09191600001864,100000 1864,100000 1889,3000000 1881,5000000 1911,5000000 1911,5000001911,5000001918,9001930,1000000 2896 11より多くの使用例:row_number()over([partition by col 1]order by col 2))as別名は、col 1パケットに従ってパケット内部でcol 2に従って並べ替えられていることを表し、この「別名」の値は、グループごとに並べ替えられた順序番号(グループ内連続の一意)を表し、「partition by col 1」は省略することができる.SELECT tacheid,
(RANK() over(ORDER BY tacheid)) rn
FROM eims_gwjk_dbcb_log t
は、まずdbcbパケットに従って、tacheid順序(すなわち、順序付け)に従って、つまり、各グループ内の自己順序であり、全体の順序ではない. level LEVELクエリデータに対応するレベルは、レヴェルが表に対して階層ツリーを巡回するselect文の中でのみ使用され、個人的な理解が遍歴するレベルが多くなるほど、レベルが大きくなります.SELECT dbcb,tacheid,
(RANK() over(partition BY dbcb ORDER BY tacheid)) rn
FROM eims_gwjk_dbcb_log t
sys.connect()by_path syssconnect()by_path関数は、親ノードの下のすべてのサブノードを、ある文字で区別して、1つの列に接続して表示することができるという主な役割を果たします.この関数を使用する前に、まず、SELECT wfid,(substr(sys_connect_by_path(dbcb,','),2)) AS dbcb,
(substr(sys_connect_by_path(tacheid,','),2)) AS tacheid,
(substr(sys_connect_by_path(tacheno,','),2)) AS tacheno,
(substr(sys_connect_by_path(senduserid,','),2)) AS senduserid,
level AS curr_level
FROM(
SELECT wfid,dbcb,tacheid,tacheno,senduserid,
(row_number() over(partition BY wfid ORDER BY senduserid)) rn
FROM eims_gwjk_dbcb_log
)
connect BY wfid = prior wfid AND rn-1 = prior rn
などのツリーを確立しなければならない.