Anmelden

View Full Version : SQL V5R4 update



KingofKning
10-10-14, 14:29
Hallo *all,
in bin ja jetzt hingegangen und habe die Emial-Datei bereinigt das jede ID nur einmal vorhanden ist. Kann ich auch fehlerfrei per sql insert reinstellen.

jetzt möchte ich in der selben Konstellation ein update laufen lassen. Muß ja später immer wieder passieren.

Ergebnis der Anweisung enthält mehr als eine Zeile.
update adr04xx t1 set t1.a4mail = (select E_MAI00001 from
email3 t2 where t1.a4kto = t2.KD_NR00001)
where t1.a4edua = 'XX'
and a4fa = 1
and a4sts = 0
and a4abkz = 0

Wie schon gesagt, in der E-Mail ist nur Kunden-Nr und E-Mail Adresse.
In der anderen Datei ist die Kunden-Nummer mit dem Schlüssel XX eindeutig.
Ich habe die Daten mal in Excel übernommen und sehe dort auch keine doppeleten Werte.

Die Fehlerbeschreibung hilft mir nicht weiter.

Nachrichten-ID . . . . : SQL0811 Bewertung . . . . . . : 30
Nachrichtenart . . . . : Diagnose

Nachricht . . . : Ergebnis der Anweisung enthält mehr als eine Zeile.
Ursache . . . . : 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.

Für Hinweise dankbar.

GG

B.Hauser
10-10-14, 15:08
Bei einem Update über meherere Tabellen muss sicher gestellt werden, dass es für jede Zeile die geändert werden soll genau eine Zeile in der zweiten Tabelle bzw. in dem SELECT-Statement vorhanden ist.

Die korrekte Syntax für den Update über meherere Tabellen sieht wie folgt aus:

update MyTable2 A
set (A.Feld1, A.Feld2) = (select Distinct B.Feld1, B.Feld2
from Mytable1 B
where A.Key1 = B.Key1
and A.Key2 = B.Key2)
where exists (select C.Key1, C.Key2
from MyTable1 C
where A.Key1 = C.Key1
and A.Key2 = C.Key2)

Birgitta

BenderD
10-10-14, 15:33
... der distinct heilt da nix (beides knallt, wenn das nicht eindeutig ist. Eigentlich müsste fetch first row only gehen (habe ich aber nicht ausprobiert, bei mir gibt es immer primary keys und stimmende key Beziehungen).
Ansonste macht man erst den update mit where exists, dann den insert mit where not exists (damit man nix unnötig doppelt macht).

D*B

Robi
10-10-14, 16:47
mit

select E_MAI00001, count(*) from
email3 group by E_MAI00001
having count(*) > 1

findest du die doppelten

Robi

KingofKning
11-10-14, 07:20
Danke das wars,
ich hatte in der email3 -Datei (keylose-Datei) wohl aus versehen den Import wohl 2 mal gemacht.
Es ist schon blöd wenn man alleine arbeitet, und man mit keinem diskutieren kann welche Schritte man gemacht hat. In der Regel kommt man beim erzählen schon selber drauf wo der Fehler ist.

Bei Gelegenheit werde ich mir meine Katze ins Büro holen, die hört zumindestens immer interessiert zu und sagt ab und zu auch miau (Meisten bei der Frage hast Du Hunger)

GG

B.Hauser
11-10-14, 09:55
@Dieter,

mein Beispiel funktioniert unter der Prämisse, dass komplett doppelte Sätze oder zumindest doppelte Sätze in denen die upzudatenden Felder bei gleichem Schlüssel die gleichen Werte beinhalten vorhanden sein können.

Sofern doppelte Schlüssel mit unterschiedlichen Werten in den übrigen Spalten vorhanden sind ist eh' Hopfen und Malz (sorry Ronald!) verloren, welcher Wert ist denn nun der richtige und welchen Wert soll er denn übernehmen?

Ob das Hinzufügen von FETCH FIRST ROW ONLY dann die Ideallösung ist, bei der gnadenlos der erste Satz mit den Schlüssel-Werten genommen wird, wage ich denn doch zu bezweifeln.
Insbesondere da der "erste" Satz abhängig von dem Zugriffsweg, den sich der Optimizer ausgesucht hat, bestimmt ist.

Birgitta

BenderD
11-10-14, 10:26
... die Katze hätte hier wohl geholfen, jedenfalls ist klar, was sie auf die Frage: "Wie findest Du diese Lösung?" gesagt hätte: "Mau!".

D*B