Laden...

Bestimmte Werte einer Spalte ersetzen

Erstellt von _Bugrick_ vor 12 Jahren Letzter Beitrag vor 12 Jahren 973 Views
_
_Bugrick_ Themenstarter:in
48 Beiträge seit 2011
vor 12 Jahren
Bestimmte Werte einer Spalte ersetzen

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

ID Besitzer

1 Hubert
2 Meier
3 Schmidt
4 Müller

TabGrundstuecke

ID Besitzer_ID Grundstueck

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!

3.430 Beiträge seit 2007
vor 12 Jahren

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

_
_Bugrick_ Themenstarter:in
48 Beiträge seit 2011
vor 12 Jahren

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...

T
156 Beiträge seit 2010
vor 12 Jahren

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

_
_Bugrick_ Themenstarter:in
48 Beiträge seit 2011
vor 12 Jahren

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.