PDA

View Full Version : Update mit Inhalt aus anderer Tabelle



linguin
22-01-08, 12:01
Hallo,

folgendes Problem:

ich habe 2. Tabellen:

A.TEILENR
A.PREIS

B.TEILENR
B.PREIS
B.CHECK

jetzt möchte ich in Tabelle A das feld PREIS mit dem Wert von Tabelle B Updaten. Aber nur wenn B.CHECK = 0.

Wie mache ich das ? irgendwie muss ich ja joinen ?

Vielen Dank

linguin

woki
22-01-08, 12:53
Update TableA as a
Set a.Preis = (Select b.Preis
From TableB as b
Where b.TeileNr = a.TeileNr)
Where exists (Select 1
From TableB as b
Where b.TeileNr = a.TeileNr
and b.Check = 0)

linguin
30-01-08, 15:23
danke woki.

jetzt bekomme ich folgende meldung:

Wahrscheinlich liefert die erste Subabfrage mehrere Zeilen zurück. Was so auch richtig ist. kann ich das limitieren ? ein "fetch first 1 rows" funktioniert nicht.


Die Ergebnistabelle einer Anweisung SELECT INTO, einer Unterabfrage oder einer Unterauswahl einer Anweisung SET enthält mehr als eine Zeile. Es handelt sich um Fehlerart 2. Bei Fehlerart 1 wurde von einer Anweisung SELECT INTO versucht, mehr als eine Zeile zurückzugeben. Bei Fehlerart 2 wurde durch eine Unterauswahl eines Basisprädikats mehr als eine Zeile erstellt. Es ist nur eine Zeile zulässig. Fehlerbeseitigung: Die Auswahl so ändern, dass nur eine Ergebniszeile zurückgegeben wird, und die Anforderung wiederholen. Zur Verarbeitung mehrerer Ergebniszeilen müssen die Anweisungen DECLARE CURSOR, OPEN und FETCH verwendet werden. Für eine Unterabfrage können die Prädikate IN, EXISTS, ANY und ALL verwendet werden, um mehrere Ergebniszeilen zu verarbeiten. Wenn eine einzige Zeile erwartet wird, können Datenfehler, wie z. B. doppelte Zeilen, auftreten, die die Rückgabe mehrerer Zeilen bewirken.

Robi
30-01-08, 16:46
wenn alle Preise gleich sind hilft distinct, sonst must du wohl selber entscheiden welches der richtige Satz ist
Robi

Fuerchau
31-01-08, 12:54
Da hilft dann wohl eher MAX/MIN/AVG, je nach dem, welcher Preis der schönere ist.

woki
01-02-08, 07:48
Dann müßte es so aussehen:



Update TableA as a
Set a.Preis = (Select min(b.Preis) <- Wahlweise min/max/avg
From TableB as b
Where b.TeileNr = a.TeileNr
and b.Check = 0)
Where exists (Select 1
From TableB as b
Where b.TeileNr = a.TeileNr
and b.Check = 0)

Fuerchau
01-02-08, 12:28
Probiers einfach aus.
Ggf. solltest du (wenn vorhanden), 0-Preise oder negative Preise ausschließen.