SQL Update mit Where-Bedingung in anderer Datenbank

schneckenschaef

Cadet 1st Year
Registriert
Jan. 2017
Beiträge
13
Hallo zusammen,
vielleicht ist meine Anfrage banal aber ich habe bisher in zahlreichen Foren keine funktionierende Lösung gefunden. Ich möchte einen Update-Befehl auf eine Datenbank (screening) schreiben, wobei die Where-Bedingung in einer anderen (probanden) als View (currentcode) vorliegt. Mein Ansatz sieht so aus:

Code:
update
`screening`.`projektzuordnung` set `screening`.`projektzuordnung`.`probandengruppe`='1'
where 
`probanden`.`currentcode`.`ID`=`screening`.`projektzuordnung`.`FK_PROBAND`
and 
`probanden`.`currentcode`.`CODE` LIKE '1112001%'

Leider bekomme ich die Fehlermeldung:
#1054 - Unknown column 'probanden.currentcode.ID' in 'where clause'

Ich gehe davon aus, dass SQL die besagte Spalte in der Datenbank "screening" sucht und deshalb nicht findet. Hat jemand eine Idee, wie ich dem System glaubhaft vermitteln kann, dass die Spalte in der anderen Datenbank existiert?

Vielen Dank schon mal vorab
Martin
 
In anderen Datenbanken. "probanden" und "screening" sind die Datenbanken; "projektzuordnung" und "currentcode" sind die Tabellen und "probandengruppe", "ID", "FK_PROBAND" und "CODE" sind die jeweiligen Spalten
 
Wenn du eine andere Tabelle oder Datenbank meinst, musst du die in deiner WHERE Clause Joinen.
where screening.link_spalte = probanden.link_spalte.
 
Das war eigentlich der Sinn dieser Zeile
Code:
where `probanden`.`currentcode`.`ID`=`screening`.`projektzuordnung`.`FK_PROBAND`
Stehe ich da auf dem Schlauch?
 
Sind "screening" und "probanden" wirklich unterschiedliche Datenbanken oder nur unterschiedliche Schemata auf der gleichen Datenbank?

Wenn du auf der gleichen Datenbank bist und unterschiedliche Schemata hast könnte es evtl. an Berechtigungen hängen.

Wenn es wirklich zwei unterschiedliche Datenbanken sind wird es so nach meinem Kenntnisstand nicht funktionieren.

Da musst dann eher sowas wie unten im Code gezeigt aufbauen, wobei du den Datenbanklink zu deiner "probanden" Datenbank halt noch auf der "screening" Datenbank anlegen müsstest:

Code:
Update
  screening.projektzuordnung
set
  screening.projektzuordnung.probandengruppe = 1
where
  screening.projektzuordnung.FK_PROBAND in (select probanden.currentcode.ID from probanden.currentcode@db_linkwhere probanden.currentcode.Code like '1112001%');

oder was evtl. noch gehen würde ist, die Daten von deiner View "probanden" in die Datenbank "sreening" überführen/ausleiten bzw. exportieren und dann wieder importieren. ;)

Hoffe, ich hab das richtig verstanden. Ansonsten sorry für evtl. Verunsicherungen. :)

P.S.: Sollte evtl. dazu sagen, dass ich aus dem Oracle Datenbank Umfeld komme. Weiß nicht inwieweit sich das evtl. mit den anderen Datenbanken deckt. :D

P.P.S.: Da ich gerade noch mal gegoogelt habe ist mir auch noch was aufgefallen. Laut deiner Aussage ist "probanden" ja die Datenbank. "Currentcode" wäre dann in deinem Fall die Tabelle. Heißt hier zwischendrin würde noch das Schema fehlen. :)

Heißt in deinem Fall sollte es dann so aussehen --> 'probanden'.<schema_name>.'currentcode'.'id' wobei natürlich <schema_name> durch deinen schema namen abgeändert werden müsste. Wäre zumindest auch noch eine Möglichkeit. ;)
 
Zuletzt bearbeitet: (P.P.S.: hinzugefügt)
Ist die andere Datenbank (probanden) von "hier" (wo immer auch hier ist ;) überhaupt erreichbar? Sprich: Funktioniert ein select * from probanden.currentcode?
Wenn ja könntest Du (sinngemäß) versuchen:

Code:
    update `screening`.`projektzuordnung` 
    set `screening`.`projektzuordnung`.`probandengruppe`='1'
    where `screening`.`projektzuordnung`.`FK_PROBAND` in (
      select `probanden`.`currentcode`.`ID`
      from `probanden`.`currentcode`
      where `probanden`.`currentcode`.`CODE` LIKE '1112001%'
    )

(sinngemäß, weil ich hinsichtlich Syntax keinen Eid schwören möchte, solange es kein Orakel oder SQL-Server ist ...)).

Edit: Flo1617 war schneller
 
Zuletzt bearbeitet:
Das eigentliche Problem in deinem Ausgangs-Statement ist, dass du in deiner WHERE Bedingung plötzlich eine Tabelle verwendest, die vorher überhaupt nicht benutzt wird. Das ist ganz unabhängig von irgendwelchen Datenbanken ein Fehler.
Wenn du auf Inhalte der Tabelle Probanden.currentcode filtern willst, musst du sie erstmal Joinen, sofern du sie nicht im FROM hast (oder eine Unterabfrage verwenden, wie die beiden Antworten oben - sollte ebenfalls funktionieren).
Daher hier die Alternativlösung ohne subquery:

Code:
UPDATE p
SET p.probandengruppe = '1'
FROM screening.projektzuordnung p
JOIN probanden.currentcode c ON c.ID = p.FK_PROBAND
WHERE c.CODE LIKE '1112001%'

Ich habe den Filterstring noch einmal in das WHERE anstatt in die ON Bedingung geschrieben (macht hier keinen Unterschied), um dir zu verdeutlichen, dass der JOIN hier das Entscheidende ist, um überhaupt auf die Tabelle filtern zu können.

Wenn es immer noch Probleme gibt, wäre interessant zu erfahren auf was für einem Datenbanksystem du unterwegs bist. Auf dem MS SQL Server bspw. sind datenbankübergreifende Abfragen kein Problem, aber relativ langsam.
 
Hallo an alle,

vielen Dank für eure zahlreichen und ausführlichen Antworten. Ich bin heute nicht im Büro, kann das also erst morgen prüfen. Generell war wohl meine Ausdrucksweise doof. Es sind unterschiedliche Schemata, welche in der gleichen Datenbankumgebung laufen. Das ganze ist in meiner Testumgebung ein XAMPP-Server mit MySQL. Die Live-Maschine variiert da ein wenig (da ist es eine MariaDB... ich weiß, total doof, dass das nicht identisch ist aber die Struktur habe ich bereits so vorgefunden und für einen Umbau habe ich gerade keine Zeit).
Ich melde mich, wenn ich eure Tipps ausprobiert habe.
Viele Grüße
Martin
 
Hallo noch mal,
vielen Dank, die Lösung von Veddem war die richtige. Jetzt tut es, was es soll
LG
martin
 
Zurück
Oben