Datenbank-Feld: Update mit "Join" bei einer m:n Verknüpfung

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Datenbank-Feld: Update mit "Join" bei einer m:n Verknüpfung

Beitrag von Aliobaba »

Hallo,

Ich habe eine Datenbank (SQLite), die (unter anderem) die Tabelle "tText" und die Tabelle "tSchlagworte" enthält. Zwischen beiden Tabellen besteht eine m:n Verknüpfung, um beliebig vielen Texten beliebig vielen Schagworten zuordnen zu können. Diese m:n Tabelle heißt "tC".

Um nun alle Texteinträge in "tText" zu finden, die einem bestimmten Schlagwort zugeordnet sind, funktioniert folgender Befehl problemlos:
SELECT * FROM tText JOIN tC ON tText.rID=tC.rFKText Where tC.rFKSchlagw = 76

Um nun Veränderungen in der Tabelle "tText" in der Spalte Y3 durchführen zu können, suchte ich mir bisher immer in einer Query die entsprechenden tText-Einträge mit obigem Befehl heraus und ging diese Einträge dann einzeln durch, um den "Y3-Eintrag" mit einem Update-Befehl für jeden einzelnen Eintrag in der Query zu verändern.

Funktioniert gut, ist auch ausreichend schnell. Aber ich denke, "elegant" ist das nicht, eher ein wenig umständlich. Irgendwie habe ich das Gefühl, dies sollte "schöner" gehen.
Deshalb meine Frage: Gibt es eine Möglichkeit, mit einem einzige SQL-Befehl sofort die Y3-Spalte bei den gewünschten Texteinträgen zu ändern?

Versucht habe ich schon viel, unter anderem auch diesen Befehl:
UPDATE tText SET Y3 = "Neuer_Eintrag" where EXISTS ( SELECT * FROM tText JOIN tC ON tText.rID=tC.rFKText Where tC.rFKSchlagw = 76 )

Funktioniert aber leider nicht, da dabei ALLE Einträge in der "Y3"-Spalte der Tabelle "tText" den "Neuen_Eintrag" erhalten.

Jemand eine Idee, wie der Befehl richtig lautet?

Danke schonmal und einen schönen Tag!
Aliobaba

Code: Alles auswählen

  
CREATE TABLE `tText` (
   `rID`   INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
   `rTitel`   VARCHAR ( 90 ) NOT NULL,
   `rText`   TEXT,
   `rHinweis`   TEXT,
   `rFKRubrik`   INTEGER DEFAULT '1',
   `rDatumerstellt`   CHAR,
   `rDatumgeaendert`   CHAR,
   `Y3`   TEXT,
   FOREIGN KEY(`rFKRubrik`) REFERENCES `tRubrik`(`rID`) ON DELETE NO ACTION
);
 
CREATE TABLE `tSchlagw` (
   `rID`   INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
   `rSchlagw`   VARCHAR ( 51 ) NOT NULL,
);
 
CREATE TABLE `tC` (
   `rID`   INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
   `rFKText`   INTEGER NOT NULL,
   `rFKSchlagw`   INTEGER NOT NULL,
   FOREIGN KEY(`rFKSchlagw`) REFERENCES `tSchlagw`(`rID`) ON DELETE CASCADE,
   FOREIGN KEY(`rFKText`) REFERENCES `tText`(`rID`) ON DELETE CASCADE
);
 
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Eb
Lazarusforum e. V.
Beiträge: 238
Registriert: Di 5. Feb 2008, 15:32
OS, Lazarus, FPC: Linux Mint - Laz 2.2.0
CPU-Target: 64Bit
Wohnort: Stuttgart

Re: Datenbank-Feld: Update mit "Join" bei einer m:n Verknüpf

Beitrag von Eb »

ohne es getestet zu haben:

Code: Alles auswählen

UPDATE tText SET Y3 = "Neuer_Eintrag" 
WHERE rID IN
(
SELECT rFKText FROM tC WHERE rFKSchlagw = 76
)

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Datenbank-Feld: Update mit "Join" bei einer m:n Verknüpf

Beitrag von Aliobaba »

Super!!! Funktioniert!! :)
Und ich spiele stundenlang mit "Join"-Befehlen rum!!

Danke!!
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Antworten