2012-04-03 10 views
1

Ich habe eine Tabelle namens "report", die Berichts-IDs und ihre jeweiligen Erweiterungscodes enthält. Gegenwärtig ist als Beispiel die einzige Erweiterung für jede ID 'TXT'. Ich versuche, eine neue Erweiterung ("RTF") in jede vorhandene Berichts-ID einzufügen. Hier ist mein Code:Keine neuen Datensätze einfügen

merge into report a 
     using (select x.rpt_id as value1, 'RTF' as value2 
      from report x 
      where x.extension <> 'RTF') b 
     on (a.rpt_id = b.value1) 
when not matched then 
     insert values (b.value1, b.value2); 

ich keine Fehler, aber nichts wird eingefügt ...

Antwort

2

Es wäre hilfreich, um eine Probe der Daten zu schreiben, bevor Sie Ihre Anweisung ausführen (nur eine Probe, von natürlich) und die gewünschten Daten, nachdem Sie Ihre Aussage ausgeführt haben.

Es klingt wie Sie für so etwas wie

INSERT INTO report(rpt_id, extension) 
    SELECT rpt_id, 'RTF' 
    FROM report 
    WHERE extension != 'RTF' 

suchen Wenn der Primärschlüssel tatsächlich ein Composite-Constraint auf der Kombination von rpt_id und extension ist, und Ihr Ziel ist Ihre Tabelle von N zu nehmen, berichtet die jeweils mit eine Erweiterung von TXT und N neue Zeilen mit dem gleichen rpt_id und eine Erweiterung von `RTF 'erstellen, wird dies funktionieren.

SQL> create table report(
    2 rpt_id number, 
    3 extension varchar2(3), 
    4 constraint extension_pk primary key(rpt_id, extension) 
    5 ); 

Table created. 

SQL> insert into report values(1, 'TXT'); 

1 row created. 

SQL> insert into report values(2, 'TXT'); 

1 row created. 

SQL> insert into report values(3, 'TXT'); 

1 row created. 

SQL> insert into report values(4, 'TXT'); 

1 row created. 

SQL> insert into report values(5, 'TXT'); 

1 row created. 

SQL> select * from report; 

    RPT_ID EXT 
---------- --- 
     1 TXT 
     2 TXT 
     3 TXT 
     4 TXT 
     5 TXT 

SQL> insert into report(rpt_id, extension) 
    2 select rpt_id, 'RTF' 
    3  from report 
    4  where extension != 'RTF'; 

5 rows created. 

SQL> select * from report; 

    RPT_ID EXT 
---------- --- 
     1 RTF 
     1 TXT 
     2 RTF 
     2 TXT 
     3 RTF 
     3 TXT 
     4 RTF 
     4 TXT 
     5 RTF 
     5 TXT 

10 rows selected. 

Basierend auf dem Fehler, den Sie bekommen, scheint es sicher, dass der Primärschlüssel nicht auf die Kombination von rpt_id und extension definiert ist.

+0

Hallo, danke für Ihre Antwort. Ich habe das oben genannte versucht, aber ich erhalte den Fehler "einzigartige Beschränkungsverletzung (Erweiterung_pk)". Sind das genug Beispieldaten? rpt_id = r00001, r00002, r00003, r00004, r00005 Erweiterung (alle von ihnen) = 'TXT' – cloudcalculus

+0

@racer - Und was soll das Endergebnis in der Tabelle sein? Wenn Sie mit 5 Zeilen beginnen, möchten Sie mit 10 Zeilen enden? Wenn dem so ist, dann nehme ich an, dass 'RPT_ID' der Primärschlüssel der Tabelle ist, was bedeutet, dass Sie nicht zwei Zeilen haben können, eine mit einer Erweiterung von RTF und die andere mit einer Erweiterung von TXT. Aber es klingt nach dem, wonach du ursprünglich gefragt hast. –

+0

Ja, das möchte ich, aber wie es funktioniert ist, dass der Primärschlüssel das Paar von rpt_id und extension ist. – cloudcalculus

Verwandte Themen