2017-05-23 1 views
1

Ich versuche, eine Brücke Tabelle mit bestehenden numerischen IDs (VARIABLE_ID Feld) und Zeichenfolgen (DETAILS Feld), die im Format averaged; smoothed pro Zelle sind. Ich habe die Strings auf ; mit REGEXP_SUBSTR und CONNECT BY aufgeteilt, die funktioniert. Wenn ich versuche, die Werte in die neue Tabelle einzufügen,PL/SQL: ORA-02287: Sequenznummer ist hier nicht erlaubt; DISTINCT Unterabfrage Probleme mit REGEXP und CONNECT BY

INSERT INTO PC_VARIABLES_DETAILS_BRIDGE (DETAIL_BRIDGE_ID, VARIABLE_ID, THE_DETAIL) 
SELECT DISTINCT PC_VAR_DETAILS_BRIDGE_PK.NEXTVAL, e.VARIABLE_ID, TRIM(REGEXP_SUBSTR(e.DETAILS,'[^;]+', 1, LEVEL)) FROM (SELECT VARIABLE_ID, DETAILS FROM EG_VAR_UPLOAD_TEST WHERE DETAILS IS NOT NULL) e 
CONNECT BY TRIM(REGEXP_SUBSTR(e.DETAILS, '[^;]+', 1, LEVEL)) IS NOT NULL; 

erhalte ich die Fehler PL/SQL: ORA-02287: sequence number not allowed here, was Sinn macht. Wenn ich DISTINCT in den FROM Satz nenne (SELECT DISTINCT VARIABLE_ID...FROM...) läuft es aber ich bekomme einen grundlegend anderen Ausgang.

zu Ansprechende nur die SELECT Klausel, was ich will, ist

SELECT DISTINCT e.VARIABLE_ID E_VARIABLE_ID, TRIM(REGEXP_SUBSTR(e.DETAILS,'[^;]+', 1, LEVEL)) THE_DETAIL FROM (SELECT VARIABLE_ID, DETAILS FROM EG_VAR_UPLOAD_TEST WHERE DETAILS IS NOT NULL) e 
     CONNECT BY TRIM(REGEXP_SUBSTR(e.DETAILS, '[^;]+', 1, LEVEL)) IS NOT NULL ORDER BY e.VARIABLE_ID; 

die IDs nur mehrere ergibt, wenn sie mit mehreren DETAILS in einer Zelle zugeordnet sind (zB averaged; smoothed), das ist, was ich will, und es läuft:

enter image description here

Aber noch einmal, wenn ich Nest DISTINCT in die FROM Klausel, erhalte ich mehrere IDs und mehrere DETAILS (in der Tat, die Gesamtzahl der Zeilen übereinstimmt, dass die Tabelle sind sie in):

enter image description here

Gibt es etwas unter der Haube Ich bin nicht sehend? Was fehlt mir hier?

Antwort

1

Es sieht so aus, als ob Sie nur eine weitere Ebene in Ihrer Auswahl benötigen. Nachdem Sie alle eindeutigen Werte erfasst haben, wählen Sie alle aus und fügen den Sequenzaufruf in eine äußere Abfrage ein. Zum Beispiel:

INSERT INTO pc_variables_details_bridge 
    (detail_bridge_id 
    ,variable_id 
    ,the_detail) 
    SELECT pc_var_details_bridge_pk.nextval 
     ,variable_id 
     ,the_detail 
    FROM (SELECT DISTINCT e.variable_id 
          ,TRIM(REGEXP_SUBSTR(e.details, '[^;]+', 1, LEVEL)) the_detail 
      FROM (SELECT variable_id 
         ,details 
        FROM eg_var_upload_test 
        WHERE details IS NOT NULL) e 
      CONNECT BY TRIM(REGEXP_SUBSTR(e.details, '[^;]+', 1, LEVEL)) IS NOT NULL); 
+0

Das tat es - danke! Ich würde wahrscheinlich irgendwann hinkommen, aber ich dachte, es wäre schneller, euch zu fragen (war es). Als richtig gekennzeichnet. – snl330

Verwandte Themen