Verwendetes Datenbanksystem: MS Access 2007 (OleDb C#, VS2005, .NET FX 2.0)
Hallo,
ich habe eine Tabelle mit Besitzern und eine mit Grundstücken, ein Besitzer kann im Moment gar keine oder mehrere Grundstücke besitzen.
TabBesitzer
1 Hubert
2 Meier
3 Schmidt
4 Müller
TabGrundstuecke
1 1 Grundstück1
2 1 Grundstück2
3 3 Grundstück3
4 3 Grundstück4
5 3 Grundstück5
6 4 Grundstück6
Nun will ich ein UPDATE-Statement erstellen, dass alle Grundstücke eines Besitzer an einen anderen überträgt und zwar anhand der Namen. Ich will dem Statement nur die Namen übergeben müssen. Ich habe beim googlen einen Aufbau gefunden, der das angeblich für MS Access kann, jedoch funktioniert auch dieser bei mir nicht, ich erkenne jedoch auch keinen Fehler:
UPDATE TabGrundstuecke g INNER JOIN TabBesitzer b ON b.besitzer = 'Meier' SET g.besitzer_id = b.id WHERE besitzer_id = (SELECT b.id FROM TabBesitzer b WHERE b.besitzer = 'Schmidt')
Was zwar einfach wäre, aber nicht geht ist ...SET g.besitzer_id = (SELECT b.id FROM...) weil ein eindeutiger Wert erwartet wird. Scheidet also wohl leider aus...
Danke schon mal!
Hallo Bugrick,
probier mal das
UPDATE TabGrundstuecke g INNER JOIN TabBesitzer b ON b.id=g.besitzer_id SET g.besitzer_id = (SELECT MAX(b2.id) FROM TabBesitzer b2 WHERE b2.besitzer = 'Schmidt') WHERE besitzer = 'Meier';
Habe es jetzt nur schnell runtergeklopft und nicht getestet, aber das sollte der Sache schon etwas näher kommen
Gruß
Michael
Eben mal getest und wie erwartet geht es auch bei mehrmaligem probieren nicht. Dieser "SET g.besitzer_id = (SELECT..." mag zwar bei anderen DB-Systemen funktionieren, aber nicht bei MS Access. Da bekomme ich immer die OleDbException "Operation muss eine aktualisierbare Abfrage verwenden."
Hab es auch schon mit "TOP 1" probiert, Sub-Select ist hier wohl nicht...
Hi,
habe gerade mal etwas rumprobiert und folgendes gefunden:
UPDATE TabGrundstuecke
SET Besitzer_ID = DLookUp("ID","TabBesitzer","[Besitzer] = 'Meier'")
WHERE Besitzer_ID = DLookUp("ID","TabBesitzer","[Besitzer] = 'Schmidt'");
Habe es auch unter Access 2003 getestet.
Wie man Access innerhalb der Funktion nach die Namen fragt, k.P..
Aber soviel erstmal,
Marko
Danke schonmal für die Antworten! 😃
Auf DLookUp bin ich bereits gestoßen, finde aber das ist auch nicht so das gelbe vom Ei. Habe gelesen, dass das recht langsam werden kann.
Habe es jetzt so gelöst, dass ich 2 Statements habe, ein SELECT, das den Wert fürs SET holt und dann ein UPDATE mit Subselect im WHERE.
Wäre trotzdem froh, wenn es eine Möglichkeit gäbe das in einem schnellen, sauberen Update-Statement zu machen.