Auswählen staticer Werte zum Vereinigen in eine andere Abfrage

Mein Problem besteht im Wesentlichen darin, dass ich in Oracle eine Abfrage ausführen muss, die eine statice list von Werten zusammenführt ("Static" bedeutet, dass sie von einem anderen Ort stammt, den ich nicht aus der database abrufen kann), aber tatsächlich eine willkürliche list von Werten ist die Abfrage) mit einer dynamischen list von Werten, die von einer Abfrage zurückgegeben werden.

Also, meine erste Abfrage sieht so aus:

select * from (select ('18776') as instanceid from dual) union (<more complex query>) 

Ich denke, hurra! Und dann versuchen Sie es mit einer längeren list von staticen Werten. Stellt sich heraus, bekomme ich "fehlende rechte Klammer", wenn ich versuche zu laufen:

 select ('18776','18775') as instanceid from dual 

Also, mein grundlegendes Problem ist, wie kann ich eine list von staticen Werten in diese Vereinigung integrieren?

Hinweis: das ist ein vereinfachtes Beispiel des Problems. Die tatsächliche list wird von einer API generiert, bevor ich eine Abfrage erzeuge, und daher ist diese list von "staticen" Werten unvorhersehbar und beliebig groß. Ich habe es nicht nur mit zwei staticen Werten zu tun, es ist eine willkürliche list.

Solutions Collecting From Web of "Auswählen staticer Werte zum Vereinigen in eine andere Abfrage"

 select '18776' as instanceid from dual union all select '18775' as instanceid from dual 

oder

 select column_value from table(sys.odcivarchar2list('18776', '18775')) 

oder eine Art hierarchische Abfrage, die Ihre Komma-Trennzeichenfolge annehmen und sie in eine Menge von Varchars aufteilen könnte.

Verknüpfen Sie diese mit Ihrer anfänglichen Abfrage.

update : "Ich habe es nicht nur mit zwei staticen Werten zu tun, es ist eine willkürliche list."

Kann immer noch als Sammlung in eine Abfrage übergeben werden (unten ist nur einer von vielen möglichen Ansätzen)

 23:15:36 LKU@sandbox> ed Wrote file S:\spool\sandbox\BUFFER_LKU_39.sql 1 declare 2 cnt int := 10; 3 coll sys.odcivarchar2list := sys.odcivarchar2list(); 4 begin 5 coll.extend(cnt); 6 for i in 1 .. cnt loop 7 coll(i) := dbms_random.string('l', i); 8 end loop; 9 open :result for 'select * from table(:c)' using coll; 10* end; 23:37:03 11 / PL/SQL procedure successfully completed. Elapsed: 00:00:00.50 23:37:04 LKU@sandbox> print result COLUMN_VALUE ------------------------------------------------------------- g kd qdv soth rvwnq uyfhbq xxvxvtw eprralmd edbcajvfq ewveyljsjn 10 rows selected. Elapsed: 00:00:00.01 

Ich denke, Sie möchten es in zwei Unterabfragen aufteilen:

 select * from ((select '18776' as instanceid from dual) union (select '18775' as instanceid from dual) union (<more complex query>) ) t; 

Beachten Sie, dass die union all besser funktioniert als die union . Wenn Sie wissen, dass es keine Duplikate gibt (oder Duplikate sind nicht wichtig), verwenden Sie stattdessen union all .

Wenn Sie die Fähigkeit / Berechtigung haben, einen Tabellentyp zu erstellen, können Sie Folgendes tun:

 CREATE OR REPLACE TYPE TYP_NUMBER_TABLE AS TABLE OF NUMBER(11); 

Und dann können Sie die TABLE-function verwenden, um aus einer Instanz dieses Typs auszuwählen, die Sie während der Ausführung in Ihrem SQL initialisieren:

 SELECT COLUMN_VALUE FROM TABLE(TYP_NUMBER_TABLE(1, 2, 3)); 

Ergebnis:

 COLUMN_VALUE ------------ 1 2 3