Hallo,
ich habe ein spezielles Problem, da es in MS Access SQL kein INSERT IGNORE gibt und in diesem Fall auch kein Primärkey weiterhilft. Am besten, ich beschreibe die Ausgangslage mit vereinfachten Tabellen:
Tabelle i: ind, nam -- das sollen Einzelpersonen sein
Tabelle f: fam, h, w -- stellt eine "Familie" dar, h+w sind "Vater" und "Mutter" von
Tabelle r: fam, c -- Kinder c in Familie fam.
In einem Visual C# Programm schreibe ich nun zunächst eine der Personen aus Tabelle i in eine Tabelle Temp. Dann werden in einer Schleife die früheren Generationen durchsucht und so Eltern, Großeltern, Urgroßeltern in Temp geschrieben:
Für die Eltern:
INSERT INTO Temp ( ind, fam, gen, nam )
SELECT i.ind, f.fam, -1, i.nam
FROM i, r, f, Temp AS t
WHERE (i.ind=f.h OR i.ind=f.w) AND f.fam=r.fam AND r.c=t.ind AND t.gen=0;
Für die Großeltern:
INSERT INTO Temp ( ind, fam, gen, nam )
SELECT i.ind, f.fam, -2, i.nam
FROM i, r, f, Temp AS t
WHERE (i.ind=f.h OR i.ind=f.w) AND f.fam=r.fam AND r.c=t.ind AND t.gen=-1;
und so weiter (Zahlen natürlich als Variablen, mit DO...WHILE (written>0), bis keine Vorfahren mehr in den Tabellen sind.
Funktioniert auch alles wunderbar, nur... es kommt vor, dass Geschwister von Vorfahren auftauchen, manche mehrfach heiraten - sprich, Einträge doppelt, vierfach usw. geschrieben werden. Idee war:
INSERT INTO Temp ( ind, fam, gen, nam )
SELECT i.ind, f.fam, -2, i.nam
FROM i, r, f, Temp AS t
WHERE (i.ind=f.h OR i.ind=f.w) AND f.fam=r.fam AND r.c=t.ind AND t.gen=-1
AND NOT IN (SELECT 1 FROM Temp AS x WHERE x.ind=i.ind AND x.fam=f.fam AND x.gen=-2);
für die 2. Generation, die anderen entsprechend - es nutzt nichts! Primärkey über ind, fam, gen nützt nichts, weil ab der SQL-Anweisung, in der ein Dupkey vorkommt, gar nichts mehr geschrieben wird.
Aber eigentlich sollte der Subselect doch gehen - wo steckt der Fehler???
Oder geht alles viel viel einfacher??? Stehe ich mit beiden Beinen fest auf dem Schlauch?
Danke
Josef
ich habe ein spezielles Problem, da es in MS Access SQL kein INSERT IGNORE gibt und in diesem Fall auch kein Primärkey weiterhilft. Am besten, ich beschreibe die Ausgangslage mit vereinfachten Tabellen:
Tabelle i: ind, nam -- das sollen Einzelpersonen sein
Tabelle f: fam, h, w -- stellt eine "Familie" dar, h+w sind "Vater" und "Mutter" von
Tabelle r: fam, c -- Kinder c in Familie fam.
In einem Visual C# Programm schreibe ich nun zunächst eine der Personen aus Tabelle i in eine Tabelle Temp. Dann werden in einer Schleife die früheren Generationen durchsucht und so Eltern, Großeltern, Urgroßeltern in Temp geschrieben:
Für die Eltern:
INSERT INTO Temp ( ind, fam, gen, nam )
SELECT i.ind, f.fam, -1, i.nam
FROM i, r, f, Temp AS t
WHERE (i.ind=f.h OR i.ind=f.w) AND f.fam=r.fam AND r.c=t.ind AND t.gen=0;
Für die Großeltern:
INSERT INTO Temp ( ind, fam, gen, nam )
SELECT i.ind, f.fam, -2, i.nam
FROM i, r, f, Temp AS t
WHERE (i.ind=f.h OR i.ind=f.w) AND f.fam=r.fam AND r.c=t.ind AND t.gen=-1;
und so weiter (Zahlen natürlich als Variablen, mit DO...WHILE (written>0), bis keine Vorfahren mehr in den Tabellen sind.
Funktioniert auch alles wunderbar, nur... es kommt vor, dass Geschwister von Vorfahren auftauchen, manche mehrfach heiraten - sprich, Einträge doppelt, vierfach usw. geschrieben werden. Idee war:
INSERT INTO Temp ( ind, fam, gen, nam )
SELECT i.ind, f.fam, -2, i.nam
FROM i, r, f, Temp AS t
WHERE (i.ind=f.h OR i.ind=f.w) AND f.fam=r.fam AND r.c=t.ind AND t.gen=-1
AND NOT IN (SELECT 1 FROM Temp AS x WHERE x.ind=i.ind AND x.fam=f.fam AND x.gen=-2);
für die 2. Generation, die anderen entsprechend - es nutzt nichts! Primärkey über ind, fam, gen nützt nichts, weil ab der SQL-Anweisung, in der ein Dupkey vorkommt, gar nichts mehr geschrieben wird.
Aber eigentlich sollte der Subselect doch gehen - wo steckt der Fehler???
Oder geht alles viel viel einfacher??? Stehe ich mit beiden Beinen fest auf dem Schlauch?
Danke
Josef
Comment