MS-SQL Abfrage Access 2003 2 Tabellen vergleichen und anhand von Vergleich updaten
Hallo Zusammen,
Ich habe folgendes Problem. Kann mir jemand helfen?
2 Tabellen. User und User_Mobile
Ich möchte in der Tabelle User die Spalte bei den Usern updaten dessen User.Login und der User_Mobile.MobLogin übereinstimmen.
Genauer:
User:
Login --- Mobile? --- Nocheinespalte --- nocheine ---
Anton --- checkbox.leer --- egal --- egal
Berta --- checkbox.leer --- egal --- egal
User_Mobile:
MobLogin --- irgendwas --- spalte2 --- weiterespalte
Anton --- x --- y --- z
Ziel: Bei den Namen die in beiden Tabellen da sind, soll ein Häckchen bei Mobile hin.
User:
Anton --- checkbox.voll --- egal --- egal
Berta --- checkbox.leer --- egal ---egal
Bisher:
UPDATE [User] SET Mobile_User = TRUE
WHERE [User].Login = [User_Mobile].MobLogin
Das Problem ist, Access fragt mich nach der Ausführung immer nach einer Bestimmt Id, d.h. ich kann dann immer nur einen User abgleichen aber der soll das für alle machen. Immerhin klappt das mit dem TRUE setzen. :-/
Danke für jede Hilfe
Antwort schreiben
Antwort 1 von Teddy7 vom 18.04.2019, 12:02 Options
Warum nutzt Du nicht den Abfrage-Assistenten in Access ?
Einfach eine Abfrage machen, in der beide Tabellen enthalten sind und über den User miteinander verknüpft sind.
Die Verknüpfungsart so einstellen, dass nur die User kommen, die in beiden Tabellen da sind.
Dann aus dieser Abfrage eine Aktualisierungsabfarge machen, in der der Haken gesetzt wird.
Gruß
Teddy
Antwort 2 von erik vom 19.04.2019, 15:09 Options
Hallo,
die von Teddy7 angesprochene Lösung dürfte als SQL so aussehen:
UPDATE [User] INNER JOIN [User_Mobile] ON [User].Login = [User_Mobile].MobLogin
SET Mobile_User = True;
Gruß
erik
Antwort 3 von Booyeoo vom 19.04.2019, 19:53 Options
Jop, danke Erik, hatte es davor auch schon so hinbekommen:
UPDATE [User] SET Mobile_User = TRUE
WHERE [User].Login IN (
SELECT [User].Login
FROM [User_Mobile] INNER JOIN [User] ON [User_Mobile].MobLogin = User.Login
);
Ich musste jedoch danach noch eine SET Anweisung hinzufügen, aber ich verstehe nicht wieso es bei einer version klappt bei der anderen nicht...
geht nicht:
UPDATE [User] SET Mobile_User = TRUE, Mobile_Client_Enddate = [User_Mobile].Enddate
WHERE [User].Siebel_Login IN (
SELECT User.Siebel_Login
FROM User_Mobile INNER JOIN [User] ON User_Mobile.Siebel_Login = User.Siebel_Login
);
geht:
UPDATE [User] INNER JOIN [User_Mobile] ON [User].Siebel_Login = [User_Mobile].Siebel_Login
SET Mobile_User = True, Mobile_Client_Enddate = [User_Mobile].Enddate;
Liegt es daran, dass im Unteren Teil die "Endtabelle" schon zur verfügung steht in der etwas geändert werden soll?
Jedenfalls vielen Dank an euch beide Erik und Teddy, jetzt bin ich in meinem MS SQL ein bissel weiter.
Antwort 4 von erik vom 20.04.2019, 09:12 Options
Hallo,
auf Anhieb kann ich gerade nicht erkennen, warum die eine Abfrage nicht funktionieren sollte. Wenn du die aufgetretene Fehlermeldung mal nennen könntest, wäre das schon hilfreich.
Unabhängig davon ist die Verwendung der IN-Klausel hier komplett überflüssig. In erster Linie werden in Access Beziehungen über JOIN-Ausdrücke erstellt (INNER JOIN, LEFT JOIN, RIGHT JOIN). Im Abfrageentwurf siehst du dann auch eine schwarze Linie als Beziehung zwischen den Tabellen.
Die Variante mit IN funktioniert zwar grundsätzlich auch, aber man muss dabei bedenken, dass für jeden Datensatz in der übergeordneten Abfrage die im IN-Block genannte Abfrage immer wieder ausgeführt wird! Das kann u.U. zu erheblichen Geschwindigkeitseinbußen führen, wenn die untergeordnete Abfrage große Datenmengen bewältigen muss. Um das zu vermeiden, sollte man möglichst nur JOIN-Ausdrücke verwenden. Du solltest daher nur die zuletzt erwähnte Abfrage aus deinem letzten Beitrag verwenden.
Gruß
erik
Antwort 5 von Boo2 vom 20.04.2019, 09:54 Options
Es kommt keine Fehlermeldung in dem Sinne, nur er will immer dann einen Parameter bekommen.
Antwort 6 von erik vom 20.04.2019, 12:02 Options
Bei einer unerwarteten Parameterabfrage ist einer der Tabellen- oder Feldnamen falsch geschrieben. In dem Parameterdialog wird dir der falsch geschriebene Name sogar angezeigt.
Antwort 7 von erik vom 20.04.2019, 12:11 Options
Ei, ist doch klar!
Bei der nicht funktionierenden Abfrage willst du die Tabelle [User] aktualisieren:
UPDATE [User]
Dort soll dieses Feld neu geschrieben werden:
Mobile_Client_Enddate = [User_Mobile].Enddate
Das Feld Enddate gehört in die Tabelle [User_Mobile] und nicht in [User]. In deiner Ergebnismenge ist aber [User_Mobile] nicht enthalten. Also wird das Feld Parameter abgefragt.
Das die Felder in der untergeordneten Abfrage vorhanden sind, spielt hier keine Rolle. Was in der IN-Klausel passiert, ist in der Hauptabfrage nicht sichtbar und nicht erreichbar. Daher solltest du nur richtige JOIN-Ausdrücke verwenden, denn dann stehen alle Felder der daran beteiligten Tabellen zur Verfügung.
Antwort 8 von Booyeoo vom 20.04.2019, 16:58 Options
Mist, so einfach kanns sein. Hast recht, vielen Dank für Deine Hilfe und Deine Mühe Erik. Das nenn ich Support. Mir ist das auch mit dem Geschwindigekitsverlust aufgefallen, daher immer besser Join ausdrücke verdwenden, wenns geht. ;-)