2017-02-10 2 views
0

Guten Morgen Gemeinschaft.Oracle: Update wo Fehler

Ich benutze MSSQL für eine Weile, und hatte dieses Problem mit MSSQL nicht, so scheint es eine Art und Weise Oracle behandelt sql. Grundsätzlich muss ich zwei Spalten in der Tabelle DANIEL_ALERT basierend auf der WHERE-Bedingung aktualisieren. Allerdings bekomme ich die "ORA-00904:" ALERT_CATEORIES "." ALERT ": ungültiger Bezeichner. Ich bin sicher, es ist nur die Art, wie Oracle Dinge tut, die anders als MSSQL ist.

Alle Ideen würden sehr geschätzt werden. Danke Dank im Voraus :)

UPDATE DANIEL_ALERT 
SET DANIEL_ALERT.ALERT_CATEGORY = ALERT_CATEGORIES.INDICATION, 
DANIEL_ALERT.ALERT_THEME = ALERT_CATEGORIES.THEME 
WHERE DANIEL_ALERT.ALERT_NAME = ALERT_CATEGORIES.ALERT; 
commit; 
+0

In der Dokumentation Stackoverflow-Domain: http://stackoverflow.com/documentation/oracle/8061/update-with-joins#t=201702100111008140877 – mathguy

+0

Könnten Sie bitte hier, um die Tabelle DANIEL_ALERT Struktur auch schreiben? – kenshinji

+0

dies würde auch nicht in MSSQL funktionieren: 'ALERT_CATEGORIES' wird nicht als teilnehmende Tabelle erwähnt – dlatikay

Antwort

-1

Versuch:

UPDATE DANIEL_ALERT SET t1.ALERT_CATEGORY = t2.INDICATION, t1.ALERT_THEME = t2.THEME VON DANIEL_ALERT t1 INNER JOIN ALERT_CATEGOR IES T2 t2.ALERT = t1.ALERT_NAME

+0

Diese Syntax wird in Oracle nicht funktionieren. Ich habe bereits einen Link zur korrekten Syntax in einem Kommentar unterhalb des ursprünglichen Posts gepostet. – mathguy

0

In Oracle eine Tabelle mit Werten aus einer anderen Tabelle zu aktualisieren ist oft am besten mit der MERGE Aussage. Etwas wie:

merge into DANIEL_ALERT d 
    using ALERT_CATEGORIES c 
    on (d.ALERT_NAME = c.ALERT) 
when matched then update 
    set ALERT_CATEGORY = c.INDICATION, 
     ALERT_THEME = c.THEME 
; 
1

Nicht zu wissen, was Ihre Tabellenstrukturen und Inhalt aussehen, können Sie mit diesem Ansatz gehen könnten, gehen zusammen mit oder als Alternative zu der völlig in Ordnung MERGE Antwort bereits gebucht:

UPDATE DANIEL_ALERT DA 
SET (DA.ALERT_CATEGORY, DA.ALERT_THEME) = (
    SELECT AC.INDICATION, AC.THEME 
    FROM ALERT_CATEGORIES AC 
    WHERE AC.ALERT = DA.ALERT_NAME 
) 
WHERE EXISTS (
    SELECT NULL 
    FROM ALERT_CATEGORIES AC 
    WHERE AC.ALERT = DA.ALERT_NAME 
); 
+0

Das sieht für mich richtig aus, obwohl ich das 'select null' in der 'exists'-Unterabfrage nicht mag. –

+0

Es sieht seltsam aus, aber es funktioniert genauso wie 'select 1' oder' select'x'', ich habe es immer so gemacht, stilistisch richtig oder falsch. =) – gmiley

+0

. . Es ist nicht "falsch". Ich bin einfach dagegen, dass "null" als etwas Gültiges gilt. Ich denke, es ist inkonsistent mit der allgemeinen Behandlung von 'NULL' in SQL. Alles andere ist vorzuziehen (ich benutze immer '1'). –

1
UPDATE DANIEL_ALERT DA 
SET (DA.ALERT_CATEGORY, DA.ALERT_THEME) = (
    SELECT AC.INDICATION, AC.THEME 
    FROM ALERT_CATEGORIES AC 
    WHERE AC.ALERT = DA.ALERT_NAME 
) 
WHERE EXISTS (
    SELECT NULL 
    FROM ALERT_CATEGORIES AC 
    WHERE AC.ALERT = DA.ALERT_NAME 
);