SQL Setze Wert in Tab A aus Tab B wenn ...

Die wilde Inge

Commander
Registriert
Aug. 2009
Beiträge
2.099
Hi,

ich habe mal folgendes Problem bei dem ich nicht weiterkomme.

Ich habe 3 Tabellen aus 2 Datenbanken und möchte, dass der Wert aus der einen Tabelle in eine andere geschrieben wird (gleiche DB) wenn 2 Verknüpfungen passen.

1605687482405.png


Es geht hier darum, dass in der DB2.devices drin steht, welcher Nutzer an welchem Rechner sitzt.
Ich brauche diese Info in der DB1.Inventory Tabelle als ID. Welcher Nutzer welche ID hat wird in DB1.Customer geregelt.

Im Wortlaut (wie ich es mir denke):

Setze DB1.Inventory.Client = DB1.Customer.Sequence

wenn

DB1.Inventory.WinUserID übereinstimmt mit DB2.devices.Username

(und wenn gleichzeitig
DB2.devices.devicename übereinstimmt mit DB1.Customer.Name (?)) (denke den zweiten Teil brauche ich vllt gar nicht).


Wenn ich einfach erstmal ein Select mache mit:

select DB1.CUSTOMER.SEQUENCE, DB2.Devices.UserName, DB2.Devices.DeviceName
FROM DB1.CUSTOMER, DB2.Devices
where DB1.CUSTOMER.WINUSERID = DB2.Devices.UserName

dann kriege ich im Select bereits alle Rechner angezeigt an denen irgendwer sitze und deren Sequence (also deren ID).

Aber ich kann diese Bedingung nicht einfach in ein SET umwandeln, weil er mir dann sagt, dass a mulit-part identifiert could not be bound.

set DB1.INVENTORY.CLIENT = DB1.CUSTOMER.SEQUENCE
where DB1.CUSTOMER.WINUSERID = DB2.Devices.UserName

Komme hier leider nicht weiter, übersteigt aktuell mein Wissen. Ich weiß nicht wieso ich hier nicht einfach den einen Wert in den anderen schreiben kann, wenn die Bedingung erfüllt ist. Geht beim Select doch auch?!

Danke schon mal für jede Hilfe.
 
Die Lösung hängt womöglich vom verwendeten DBMS ab. MariaDB, PostgreSQL?
Gibt es einen konkreten Grund, warum du Redundanzen in deine Datenbanken schreiben möchtest? Ist das ein einmaliger Import von DB2 nach DB1 oder so?
Ein kleines Beispiel wäre dem Verständnis sehr zuträglich.
 
ich habe zwei Produkte, die miteinander sprechen und jede hat ihre eigene MS SQL Datenbank.
Bei der Übertragung der Info, welcher Nutzer an welchem Rechner sitzt ist aktuell ein Denkfehler und ich will nicht warten bis der Hersteller irgendwann mal zur Tat schreitet. Also will ich die Info wer an welchem Rechner sitzt 'einfach per Hand' rüberziehen - regelmäßig.

Die Möglichkeit zu sagen, dass sich Produkt A die Info gleich aus der DB von PRodukt B holt wäre allerdings zu viel des Guten. Ich will und kann auch nicht einfach in das Produkt eingreifen. Aber Datenmanipulation in der DB ist natürlich kein Problem.
Ergänzung ()

kein Problem im technischen sinne, weil praktisch scheitere ich ja gerade :D
 
Dir fehlen auch Joins, so wie du abfragst verwendest du alten Syntax der nicht gerade peformant oder übersichtlich ist. Kann leider gerade nicht genauer schauen, was passieren soll, vielleicht später am Tag
 
  • Gefällt mir
Reaktionen: Die wilde Inge
Das Update soll jetzt einmal passieren, richtig ? Oder soll das quasi als Prozedur adhoc immer wieder passieren ?

Wenn es ne einmalige Sache ist, denk mal drüber nach aus deinem Select ne temporäre Zwischentabelle zu machen, in der du alle informationen kurz ablegst.
daraus lässt sich dann viel einfacher ein simples update bauen und du umgehst das problem das du nicht weißt wie man in einen record schreibt (bin nur in oracle fit - ka wie das in MSSQL heißt oder geht)
 
Oelepoeto schrieb:
Dir fehlen auch Joins, so wie du abfragst verwendest du alten Syntax der nicht gerade peformant oder übersichtlich ist. Kann leider gerade nicht genauer schauen, was passieren soll, vielleicht später am Tag

Danke für den Tipp.

select DB1_.CUSTOMER.SEQUENCE, DB1.CUSTOMER.WINUSERID, DB2.Devices.DeviceName

FROM DB1.CUSTOMER INNER JOIN DB2.Devices ON DB1.CUSTOMER.WINUSERID = DB2.Devices.UserName
 
Also dann, jetzt bist du eh schon fast am Ziel..

so ganz versteh ich dein Datenmodell irgendwie nicht mit die verschiedenen Namen, aber wahrscheinlich bin ich einfach noch nicht ganz wach.

Prinzipiell müsste dein Statement etwas so auschauen:

UPDATE i SET CLIENT = c.SEQUENCE
FROM DB1.INVENTORY i
INNER JOIN DB2.devices d ON d.Devicename = i.Name
INNER JOIN DB1.CUSTOMER c ON c.WinUserID = d.Username

ich verwende dabei jeweils ein Alias für die Tabelle damit das Statement leichter lesbar ist.
 
  • Gefällt mir
Reaktionen: BeBur und Die wilde Inge
Oelepoeto schrieb:
Prinzipiell müsste dein Statement etwas so auschauen:

UPDATE i SET CLIENT = c.SEQUENCE
FROM DB1.INVENTORY i
INNER JOIN DB2.devices d ON d.Devicename = i.Name
INNER JOIN DB1.CUSTOMER c ON c.WinUserID = d.Username

Hat funktioniert!

Ich war gerade dabei "Update DB1.INVENTORY" zu schreiben, da kam die Mail Benachrichtung von CB wegen einer neuen Meldung :daumen:

Auf jeden Fall noch mal herzlichen Dank. Das mit den Joins war gut, deutlich simpler. Wieder was gelernt.
 
  • Gefällt mir
Reaktionen: Oelepoeto
Super, freut mich :-)
Ergänzung ()

Vielleicht noch ein Hinweis, falls es dir nicht eh schon bewusst ist: mit dem Statement werden immer alle Datensätze überschrieben, wo die Joins aufgehen. Eventuell wäre es noch sinnvoll eine Einschränkung einzubauen, wo geprüft wird welche Werte unterschiedlich sind.
 
Zuletzt bearbeitet:
Zurück
Oben