2010-12-19 11 views
1

I eine Tabelle A mit Spaltencode haben, die Werte AB, BCOracle SQL-Abfrage

----- 
code 
----- 
'AB','BC' 

Tabelle B Zeile hat folgende

------------------------------ 
AB 4 2 1 
------------------------------ 
------------------------------- 
BC 1 2 3 
-------------------------------- 

Für AB enthält, gibt es ein Zeileneintrag in einer anderen Tabelle B und in ähnlicher Weise für BC

ich verwenden möchte IN-Klausel für den Spalt Code

select regexp_substr(replace (a.code,'''',''), '[^,]+', 1, level) from A a , C b 
WHERE a.id ='SC_1' AND a.id= b.id AND a.name = 'CODE' 
connect by level <= length(regexp_replace(replace (a.code,'''',''), '[^,]*')) + 1 

Wenn ich über SQL ausführen, gibt es kein Ergebnis, ich denke, die IN-Klausel erfordern Zeile eher Komma getrennt. Lassen Sie mich bitte wissen, wie man das auskostet.

+1

Sie müssen diesen Code wirklich in zwei separate Spalten teilen, damit die Leistung nicht beeinträchtigt wird. Vielleicht betrachten Sie Virtual Columns http://www.oracle-base.com/articles/11g/VirtualColumns_11gR1.php –

Antwort

3

Sie müssen Ihre code Zeichenfolge über mehrere Zeilen teilen. Versuchen Sie:

select * from B 
where B.code in (
    select regexp_substr(code, '[^,]+', 1, level) from A 
    connect by level <= length(regexp_replace(code, '[^,]*')) + 1) 
+0

Ich mag das. Ich hätte das wahrscheinlich mit zwei Abfragen und einigen Skripten dazwischen in der Serversprache oder einer gespeicherten Prozedur tun müssen. ist connect-by in mysql oder vielen anderen db's neben oracle? –

+0

@Frederic danke, ich werde versuchen, zu überprüfen, ob es funktioniert. –

+0

@jon_darkstar, sollten Sie 'WITH' in anderen RDBMS verwenden können. Siehe http://www.ibm.com/developerworks/data/library/techarticle/dm-0510rielau/. –