PDA

View Full Version : SQL Statement



Mädele
26-02-03, 14:59
Hallo,

benötige Hilfe bei einem SQL Statement.

Ich möchte ein Feld aus DateiA mit einem Feld aus DateiB updaten, Schlüssel ist FeldXY aus DateiA.

Danke!

Gruß,
Mädele

Fuerchau
26-02-03, 15:18
update DateiA set f1=(select f1 from DateiB where DateiA.Key = DateiB.Key and ...)
where DateiA.Key in (Select DateiB.Key from DateiB)

Liest sich kompliziert ist es aber nicht.
Der 1. Subselect selektiert genau ein Feld, dessen Schlüssel zu DateiA passt.
Ist jedoch kein passender Satz vorhanden, liefert der Select NULL. Ist NULL jedoch weder erlaubt, geschweige denn gewünscht, muss ich den Update per Where auf genau die vorhandenen Sätze einschränken.

Mädele
27-02-03, 08:41
Hallo,

habe das Statement ausgeführt und bekomme die Fehlermeldung -Ergebnis der Anweisung enthält mehr als eine Zeile-

update datei a set a.feld1=(select b.feld1 from datei b where a.key1 = b.key1) where a.key1 in (select b.key1 from datei b)

..mit where exists hab ich es auch schon versucht - gleiche Fehlermeldung.

Was mache ich falsch?

Fuerchau
27-02-03, 10:08
Im 1. Subselect darf nur 1 Zeile als Ergebnis kommen, d.h., dass der Key nicht eindeutig ist !
Für diese Form des Updates benötigst du eine EINDEUTIGE Beziehung um genau EINEN Satz zu selektieren.
Falls das Feld Key1 nicht ausreicht mußt du halt mit "and" weitere Schlüssel auswählen.

Frage: Ist dein Beispiel das richtige ? Es scheint, dass du den Update auf sich selbst durchführst.

Mädele
27-02-03, 11:32
Hallo,

ich verwende als eindeutigen Schlüssel die Teilenummer, welche in beiden Dateien vorhanden ist. Jede Teilenummer kommt nur einmal in den Dateien vor.

Grüße,
Mädele

[Dieser Beitrag wurde von Mädele am 27. Februar 2003 editiert.]

Fuerchau
27-02-03, 14:39
Um das zu überprüfen mach erst mal einen normalen select:

select rrn(a), a.feld1, a.key1, rrn(b), b.feld1, b.key1
from datei a, datei b
where a.key1=b.key1

Mit der Funktion RRN(x) wird die Satznummer der Datei ausgegeben. Wenn die Satznummer von (b) mehrmals auftaucht hast du ein Problem (nicht eindeutig).

Oder prüfe folgendes

select key1, count(*) from datei
group by key1
having count(*)>1

Damit bekommst du alle Schlüssel, die mehr als 1 Mal vorkommen.

Mädele
27-02-03, 15:12
Hallo,

Du hattest Recht - doch jetzt tut sich ein neues Problem auf.
Ich habe z.B. 2 Sätze des gleichen Schlüssels, möchte aber den aktuellsten Satz. Wie mache ich das mit SQL?

Fuerchau
27-02-03, 19:08
Den aktuellsten Satz kann man nur an Hand der Daten selbst feststellen, als z.B. Datum/Zeit, Timestamp oder Zähler.

Ab V5 kann man im Select die Anzahl Sätze bestimmen (vorher leider nicht):

select .... from datei a where key1=...
and Zeit = (select max(Zeit) from datei b where a.key1 = b.key1)
fetch first 1 row

Ob Fetch allerdings auch im subselect funktioniert, wage ich zu bezweifeln.

Wenn der zu selektierende Wert in allen doppelten Schlüsseln identisch ist, kannst du auch noch mit "SELECT DISTINCT ..." im Subselect arbeiten.

Ansonsten gehts halt nur noch per Programm !