Thema: MS-SQL Abfrage Access 2003 2 Tabellen vergleichen und anhand von Vergleich updaten


Seite durchsuchen:
Home


zurück zur Übersicht

Diskussionsgruppe: Datenbanken

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

Von: Booyeoo Datum: 18.04.2007, 11:40

alle Antworten zu dieser Frage




Antwort 1 von Teddy7 vom 18.04.2007, 12:02
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.2007, 15:09
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.2007, 19:53
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.2007, 09:12
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.2007, 09:54
Es kommt keine Fehlermeldung in dem Sinne, nur er will immer dann einen Parameter bekommen.

Antwort 6 von erik vom 20.04.2007, 12:02
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.2007, 12:11
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.2007, 16:58
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. ;-)

Antworten der Gruppe: Datenbanken
www.supportnet.de







Office 365 stellt vertraute Microsoft Office-Tools für die Zusammenarbeit und Produktivität über die Cloud bereit. So können alle ganz einfach von nahezu überall zusammenarbeiten und auf E-Mails, Webkonferenzen, Dokumente und Kalender zugreifen.