# [Oracle] Update über zwei Tabellen



## KITAEB (24. Januar 2012)

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:

```
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


----------



## Yaslaw (24. Januar 2012)

Jepp. Das Subquery liefert pro T2.LID mehrere Resultate. Du musst das irgendwie auf eines beschränken.


----------



## KITAEB (24. Januar 2012)

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****?


----------



## Yaslaw (24. Januar 2012)

Also, wenn du nur das Subquery ausführst

```
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.


----------



## tkeuk (25. Januar 2012)

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


----------



## Yaslaw (25. Januar 2012)

@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.


----------



## tkeuk (25. Januar 2012)

@Yaslaw
wo du recht hast hast du recht  doch ich habe es im Kontext als Einzelquery angeschaut, sorry


----------

