[Oracle] Update über zwei Tabellen

KITAEB

Grünschnabel
Hallo,

ich versuche ein Feld aus einer Tabelle (T1) mit einem Wert aus einer anderen Tabelle (T2) füllen zu lassen, wenn bestimmte Bedingungen erfüllt sind.
Bedingungen:
1. Die ID's (LID = FKLID) müssen die selben sein.
2. Der Inhalt aus T1.Feld_1 muss ungleich T2.Feld_1 sein!

Wenn dies der Fall ist, sollte der Wert aus T1.Feld_1 in das Feld T2.Feld_2 geschrieben werden.

Bei meinem letzten Versuch, habe ich mich an einem Beitrag aus diesem Forum orientiert. Bekommen jedoch immer folgende Fehlermeldung:

"ora-01427 single-row subquery returns more than one row"

Der Versuch sah wie folgt aus:
Code:
UPDATE T2
SET    T2.Feld_1 = ( 
                    SELECT T1.Feld_1 
                    FROM   T1 
                    WHERE  T1.Feld_1 <> T2.Feld_1 
                    AND    T2.LID = T1.FKLID 
                    )

Hat jemand eine Idee, wo der Fehler liegen kann? Bin über jede Hilfe dankbar!

MFG
 
Jepp. Das Subquery liefert pro T2.LID mehrere Resultate. Du musst das irgendwie auf eines beschränken.
 
Danke erstmal für die Antwort!

Da ich die LIDs kenne, die betroffen sind, habe ich das auch schon mal versucht, die T2.LID und die T1.FKLID mit den jeweiligen Werten zu versehen, z.B.: T2.LID = 41 and T1.FKLID = 41. Hat aber leider auch nichts gebracht. Es erschien die selbe Meldung.

Oder meinst du was anderes****?
 
Also, wenn du nur das Subquery ausführst
SQL:
SELECT T1.Feld_1 
FROM   T1 
WHERE  T1.Feld_1 <> T2.Feld_1 
AND    T1.FKLID = 42
Dann darf da nur eine Zeile erscheinen. Wenn du mehrere hast, dann musst du die Daten weiter eingrenzen (WHERE oder/und GROUP BY).
Das Subquery darf nur 1 Zeile haben - ansonsten kommt dein Fehler. Oracle weiss dann nicht, welchen der Werte es verwenden soll.
 
Zuletzt bearbeitet von einem Moderator:
denke wenn du das Subquery weiter einschränkst sollte es gehen

SELECT T1.Feld_1
FROM T1
WHERE T1.Feld_1 <> T2.Feld_1
AND T2.LID = T1.FKLID AND T1.FKLID = 42

du darfst auch wenn du weiter einschränkst NIE den Join der beiden Tabellen vergessen :)
sonst hat Oracle keine Ahnung welcher der DS er nehmen soll

Mfk
 
@tkeuk
Nunja, er hat bei der id=42 das Problem. Einfach die Menge wieder auf id=42 bringt noch keinen Mehrwert. Er braucht weitere Kriterien oder ein GROUP BY oder sowas.
Das von dir Fett markierte Teil ist soweit Richtig. Aber eignet sich nicht wenn er nur das Subquery testen soll. Im Gesammtkontex ist der ID-Vergleich soweit richtig, nicht jedoch der Vergleich auf 42, da dies ja nur ein Fall betrifft und für die restlichen Daten falsch ist.
 
Zurück