Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Bestimmte Werte einer Spalte ersetzen
_Bugrick_
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

Bestimmte Werte einer Spalte ersetzen

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
michlG
myCSharp.de - Experte

Avatar #avatar-2909.png


Dabei seit:
Beiträge: 3652
Herkunft: Naturns - Südtirol - Italien

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
_Bugrick_
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
trashkid2000
myCSharp.de - Member



Dabei seit:
Beiträge: 157

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
_Bugrick_
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers