2016-04-11 8 views
0

Oracleデータベースの初心者であることから、お手数をおかけします。Oracle、「接続」ステートメントを使用した重複レコード

私は別のレコードにそれぞれcaracterに1つずつ文字列を分割する必要があります。

私はいくつかの文字に分割する必要がVARCHARフィールド

select 
    MAPS.MAP_ID, 
    HARD_BIN_LINES.LINE, HARD_BIN_LINES.BINS 
from MAPS, HARD_BIN_LINES 
where MAPS.MAP_ID = 9595435 and MAPS.MAP_ID = HARD_BIN_LINES.MAP_ID 
order by HARD_BIN_LINES.MAP_ID, HARD_BIN_LINES.LINE 


MAP_ID LINE BINS 
9595435 1  ÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿ 
9595435 2  ÿÿÿÿÿÿÿþþ  þþÿÿÿÿÿÿÿÿ 
9595435 3  ÿÿÿÿÿþþ2   þÿÿÿÿÿÿ 
9595435 4  ÿÿÿÿþ    þþÿÿÿÿ 
9595435 5  ÿÿÿþ2     þÿÿÿ 
9595435 6  ÿÿþ     þÿÿ 
9595435 7  ÿÿþ2     þÿÿ 
9595435 8  ÿþþÿ     þþÿ 
9595435 9  ÿ2      þÿ 
9595435 10  þÿ      þÿ 
9595435 11  þ      þ 
9595435 12  ü      þ 
9595435 13  ü2      þ 
9595435 14  þ      þ 
9595435 15  þ      ÿ 
9595435 16  ÿþ    xx  þÿ 
9595435 17  ÿþ      þÿ 
9595435 18  ÿÿþ     þÿÿ 
9595435 19  ÿÿþ     þÿÿ 
9595435 20  ÿÿÿþ     þÿÿÿ 
9595435 21  ÿÿÿÿþ    þþÿÿÿÿ 
9595435 22  ÿÿÿÿÿþ  þ 2 þÿÿÿÿÿÿ 
9595435 23  ÿÿÿÿÿÿÿþ þ þþ ÿÿÿÿÿÿÿÿ 
9595435 24  ÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿ 

を含むクエリを持っている私の目標はにありますこの

MAP_ID LINE LEVEL CHR BINCODE 
-------+-------+-------+---+-------- 
9595435 1  2  ÿ 255 
9595435 1  3  ÿ 255 
9595435 1  4  ÿ 255 
9595435 1  5  ÿ 255 
9595435 1  6  ÿ 255 
9595435 1  7  ÿ 255 
9595435 1  8  ÿ 255 
9595435 1  9  ÿ 255 
9595435 1  10  ÿ 255 
9595435 1  11  ÿ 255 
9595435 1  12  þ 254 
9595435 1  13  þ 254 
9595435 1  14  þ 254 
9595435 1  15  þ 254 
9595435 1  16  ÿ 255 
9595435 1  17  ÿ 255 
9595435 1  18  ÿ 255 
9595435 1  19  ÿ 255 
9595435 1  20  ÿ 255 
9595435 1  21  ÿ 255 
9595435 1  22  ÿ 255 
9595435 1  23  ÿ 255 
9595435 1  24  ÿ 255 
9595435 1  25  ÿ 255 
9595435 1  26  ÿ 255 
-------+-------+-------+---+-------- 
9595435 2  2  ÿ 255 
9595435 2  3  ÿ 255 
9595435 2  4  ÿ 255 
9595435 2  5  ÿ 255 
9595435 2  6  ÿ 255 
9595435 2  7  ÿ 255 
9595435 2  8  þ 254 
9595435 2  9  þ 254 
9595435 2  10   1 
9595435 2  11   1 
9595435 2  12   10 
9595435 2  13   1 
9595435 2  14   13 
9595435 2  15   17 
9595435 2  16   1 
9595435 2  17  þ 254 
9595435 2  18  þ 254 
9595435 2  19  ÿ 255 
9595435 2  20  ÿ 255 
9595435 2  21  ÿ 255 
9595435 2  22  ÿ 255 
9595435 2  23  ÿ 255 
9595435 2  24  ÿ 255 
9595435 2  25  ÿ 255 
9595435 2  26  ÿ 25 
-------+-------+-------+---+-------- 
(...) 

のようにレコードセットをobtaingいくつかの手紙/レコードにBINSの文字列を分割私が声明「BY CONNECT」で遊んで問題を解決しようとすると、私は多くを得ますレコードを複製し、私のクエリに間違って何もない理由を私は理解できません:あなたのtemp結果セットの

with temp as (
    select 
     MAPS.MAP_ID, 
     HARD_BIN_LINES.LINE, HARD_BIN_LINES.BINS 
    from MAPS, HARD_BIN_LINES 
    where MAPS.MAP_ID = 9595435 and MAPS.MAP_ID = HARD_BIN_LINES.MAP_ID 
    order by HARD_BIN_LINES.MAP_ID, HARD_BIN_LINES.LINE 
) 
select 
    MAP_ID, LINE, LEVEL, 
    substr(BINS,level,1) as CHR, ASCII(substr(BINS,level,1)) as BINCODE 
from temp 
connect by level <= length(BINS) 
+1

によって接続することは、再帰的(豚の耳)自己参照外部キー関係でのみ使用できます。構文で接続するには、 = の前に接続します。再帰的な関係のないテーブルの範囲で接続しようとしています。 MAPSとHARD_BIN_LINESの構造を共有してください。 –

+0

CONNECT BYは、文字列を分割するために使用した独自の方法で使用されています(ref @Aleksej answer http://stackoverflow.com/questions/36542072/oracle-database-split-a-string-文字による)。 MAPSとHARD_BIN_LINESはMAP_IDによってのみ参照され、私の目標はHARD_BIN_LINES.BINS文字列をソースASCIIコードを取得するためにいくつかのレコード(各文字に1つ)に分割することです。 とにかく、質問にテーブル構造を追加します。 –

答えて

0

各行は、他のすべての回線に接続されます。再帰を同じ行に制限する必要があります(prior line = line句)。しかし、ループを避ける必要もあります。

select 
    MAP_ID, LINE, LEVEL, 
    substr(BINS,level,1) as CHR, ASCII(substr(BINS,level,1)) as BINCODE 
from temp 
connect by prior line = line 
and prior dbms_random.value is not null 
and level <= length(BINS); 

あなたが投稿暫定データから623行を取得します。一つの方法は、別のprior句で非決定的関数を参照することです。同じ結果を得る

with temp as (
    select ... 
), 
r (MAP_ID, LINE, LVL, CHR, BINCODE) AS (
    select MAP_ID, LINE, 1, substr(BINS,1,1), ASCII(substr(BINS,1,1)) 
    from temp 
    union all 
    select t.MAP_ID, t.LINE, r.LVL + 1, substr(t.BINS,r.LVL + 1,1), 
    ASCII(substr(BINS,r.LVL + 1,1)) 
    from r 
    join temp t on t.MAP_ID = r.MAP_ID and t.LINE = r.LINE and length(t.BINS) > r.LVL 
) 
select * 
from r; 

を:あなたは11gR2のにしている以上、あなたもrecursive subquery factoringを使用することができれば

関連する問題