2016-04-11 15 views
0

Oracle veritabanında neredeyse yeni bir kullanıcı olduğum için yardımınızı rica ediyorum.Oracle, "connect by" deyimini kullanarak kayıtları çoğaltma

ben

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  ÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿ 

Amacım etmektir birkaç karaktere ayrılmıştır gereken VARCHAR alanıyla içeren bir sorgu var:

farklı kayıtlar her caracter için bir içine bir dize bölmek gerekir Ben oynarken sorunu çözmek çalışırsanız bu

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 
-------+-------+-------+---+-------- 
(...) 

gibi bir kayıt kümesi obtaing birkaç harf/kayıt içine bölünmüş BINS dize birçok elde açıklamada "BY CONNECT" kayıtları çoğaltmak ve benim sorguyu sorunun ne ne neden anlayamıyorum: En temp sonuç kümesindeki

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

Sadece bir özyineleme (domuz kulağı) kendi kendine referans gösteren yabancı anahtar ilişkisi ile kullanılabilir. Sözdizimi ile bağla: önceki = ile bağlan. Yinelemeli ilişkileri olmayan tablolarda bir aralık ile bağlanmayı deniyorsunuz. Lütfen MAPS ve HARD_BIN_LINES yapısını paylaşın. –

+0

CONNECT BY, bir dizgeyi chars ile ayırmanın benzersiz bir yolu olarak kullanıldı (http://stackoverflow.com/questions/36542072/oracle-database-split-a-string- adresindeki yanıt @Aleksej yanıtı yan karakterler). MAPS ve HARD_BIN_LINES, yalnızca MAP_ID tarafından başvurulan ve hedefim, kaynak ASCII kodunu almak için HARD_BIN_LINES.BINS dizesini birkaç her kaynağa (her karakter için bir tane) bölmek. İstendiği gibi, tablo yapısını sorumu ekleyeceğim. –

cevap

0

Her satır her satırda bağlanıyor. Yinelemeyi prior line = line yan tümcesiyle aynı hatta sınırlamanız gerekir. Ama aynı zamanda döngüden kaçınmanız gerekir; tek yönlü başka prior maddesi olmayan bir deterministik işlevine başvurmak için geçerli: Yayınladığınız geçici verilerinden 623 satırları alır

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); 

. aynı sonucu alır

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; 

: Eğer 11gR2 konum veya daha yüksek ayrıca recursive subquery factoring kullanabilirsiniz Eğer

.

İlgili konular