PDA

Vollständige Version anzeigen : DOMWERT bei INSERT INTO


SebastianMüller
27.10.2003, 12:07
Hallo,

wie kann ich mit SQL Datensätze von einer Tabelle in eine andere einfügen. Aber nur dann, wenn dieser Datensatz noch nicht existiert.

Beispiel: Kundennummer und Kundenname soll in Tabelle tblKunden nur dann eingefügt werden, wenn die Kundennummer dort noch nicht existiert.

Das mus ja irgendwie mit DomWert funktionieren, oder?

INSERT INTO tblKunden ( [Kunden-Nr], Kundenname ) SELECT Vertragsdaten.[Kunden-Nr], Vertragsdaten.Kundenname FROM Vertragsdaten WHERE ??? DOMWERT ( Vertragsdaten; tblKunden; [Kunden-Nr] <> [Kunden-Nr]) ???

Geht das so ähnlich?

Danke.

Nouba
27.10.2003, 12:20
Hallo Sebastian,

da ich annehme, dass ein Kunde auch mehrmals in den Vertragsdaten stehen kann, würde ich es einmal mit (Backup ist natürlich obligatorisch) folgender Abfrage versuchen.
INSERT INTO tblKunden
(
[Kunden-Nr]
, Kundenname
, [Kunden-Nr]
)
SELECT
V.[Kunden-Nr]
, First(V.Kundenname)
, K.[Kunden-Nr]
FROM Vertragsdaten AS V LEFT JOIN
tblKunden AS K ON
V.[Kunden-Nr] = K.[Kunden-Nr]
WHERE K.[Kunden-Nr] Is Null
GROUP BY V.[Kunden-Nr]

BTW: Domänenaggregatfunktionen in Abfragen gelten als sehr langsam.

SebastianMüller
27.10.2003, 12:51
Entschuldigung, aber so recht komme ich damit nicht klar.

Habe jetzt folgendes übernommen:

Kundennummer = Tabelle mit Kudennummer und Leasingnehmer
Vertragsdaten = Tabelle mit Importdaten welche abgeglichen werden sollen

[Kunden-Nr] = Kundennummer
Leasingnehmer = Kundenname


CurrentDb.Execute ("INSERT INTO Kundennummer([Kunden-Nr], Leasingnnehmer, [Kunden-Nr]) " & _
"SELECT Vertragsdaten.[Kunden-Nr], First(Vertragsdaten.Leasingnehmer), Kundennummer.[Kunden-Nr] FROM Vertragsdaten AS Vertragsdaten LEFT JOIN " & _
"Kundennummer AS Kundennummer ON Vertragsdaten.[Kunden-Nr] = Kundennummer.[Kunden-Nr] WHERE Kundennummer.[Kunden-Nr] Is Null GROUP BY Vertragsdaten.[Kunden-Nr]")


Wobei ich der Meinung war, das K = Kundennummer und V = Vertragsdaten bedeutete.

Da ist irgendwas falsch.

Nouba
27.10.2003, 13:18
Hallo Sebastian,

CurrentDb.Execute "INSERT INTO Kundennummer( [Kunden-Nr], Leasingnnehmer, [Kunden-Nr]) " _
& "SELECT" _
& " V.[Kunden-Nr]" _
& ", First(V.Leasingnehmer)" _
& ", K.[Kunden-Nr] " _
& "FROM Vertragsdaten AS V LEFT JOIN" _
& " Kundennummer AS K ON" _
& " V.[Kunden-Nr] = K.[Kunden-Nr] " _
& "WHERE K.[Kunden-Nr] Is Null " _
& "GROUP BY V.[Kunden-Nr]", <b>dbFailOnError</b>
dbFailOnError sollte Dir im Zweilsfall eine Fehlerausgabe gestatten. Mit Alias-Namen (K und V im Beispiel) macht man Abfragen kürzer und lesbarer.

SebastianMüller
27.10.2003, 13:52
Hallo nouba,

danke für deine Antwort.

Habe es jetzt so übernommen.

Erst sagte er mir was mit doppelte zielwerte. Da habe ich das zweite [Kunden-Nr] hinter INSERT INTO raus genommen.
Jetzt kommt er mit "Anzahl der Abfragewerte stimmen mit Anzahl der Zielwerte nicht überein.".

Das ist ja auch richtig. Es sind in der Importdatei weitaus mehr Kundennummern als in der Tabelle Kundennummer.

Idee?

Nouba
27.10.2003, 13:59
dann lade doch mal bitte ein Minimalbeispiel der DB gezippt hoch.

SebastianMüller
27.10.2003, 14:10
So, habe mal das meiste raus gelöscht und nur die beiden Tabellen drin gelassen.

...

Nouba
27.10.2003, 14:25
Hallo Sebastian,

da Du referentielle Integrität eingestellt hast, müssen die Daten aus Vertragsdaten auch in Kundennummer schon vorhanden sein. Hebe mal die Beziehung auf und lösche einige Daten, die auch in Vertragsdaten drin stehen, und versuche es erneut mit der Aktualisierungsabfrage.

SebastianMüller
27.10.2003, 14:39
Funktioniert trotzdem nicht. die selben Fehlermeldungen wie oben.

Nouba
27.10.2003, 14:50
Ich bleibe bei meiner Aussage. Ich habe mal in Vertragsdaten einen neuen DS angelegt und die Anfrage würde ihn brav in Kundennummer anfügen.

SebastianMüller
28.10.2003, 09:30
Hallo,

also wenn ich die Anfrage manuell ausführe, so funktioniert es.

Mache ich es über den Code, geht es nicht. Oben genannte Fehlermeldungen.

SebastianMüller
28.10.2003, 12:04
Muss ich es doch über RecordSets machen?

Es will einfach nicht per Code funktionieren. Das kann doch nicht sein, oder? Mache ich Doppelklick auf die Abfrage, dann gehts.

SebastianMüller
28.10.2003, 12:17
So, da soll einer mal sagen das geht nicht. :-)

Nun doch leicht abgeändert:


CurrentDb.Execute "INSERT INTO Kundennummer ( [Kunden-Nr], Leasingnehmer )" _
& " SELECT V.[Kunden-Nr], V.Leasingnehmer" _
& " FROM Kundennummer AS K RIGHT JOIN Vertragsdaten AS V ON K.[Kunden-Nr] = V.[Kunden-Nr]" _
& " WHERE (K.[Kunden-Nr]) Is Null", dbFailOnError


Danke.