Update Table mit Inner join

Hallo leuts, ich bin wieder mal nach der Suche nach Prof. Hile :confused:

Ich möchte gerne eine Tabelle updaten mithilfe von Innerjoin.

Ich habe also mehrere Tabellen (es geht um videothek webseite)

Tabellen: Movies, Inventar, Verleihliste, Users

Tabelle movies:
m_id, titel,description

Tabelle: Inventar
m_id(reference zu movies), bar_id (primary_key), preis_category

Tabelle: Verleihliste:
v_id (verleih_id), bar_id (reference zu inventar bar_id), u_id (wer den Film geliehen hat),
startdate, enddate

Users Tabelle:
u_id, name, vorname, email, etc…


Jetzt möchte ich anhand der u_id und der m_id (movieId) die verleihliste updaten. Also das Enddate Datensatz auf aktuelles datum setzte. Ich bekomme jedoch immer zwei datensätze und es werden immer zwei datensätze upgedatet, also auch movies die nicht abgegeben werden. Wenn ich also movie mit id=1 abgebe, so wird auch movie mit Id=2 auf abgegeben gesetzt (also enddate auf actal date heist abgegeben, ansonsten ist es NULL als default)

meine query:
UPDATE verleihliste set enddate=actualDate
FROM (verleihliste as v INNER JOIN inventar ON v.bar_id=inventar.bar_id)
where inventar.m_id=1 and v.u_id=1;

was mache ich da falsch??

es muss ja der Film mit der ID=1 abgedatet werden, und der Film wurde von User mit der ID=1 ausgeliehen??? Warum daten er auch andere filme ab???

Das ist evtl. schwere Aufgabe.

Danne habe ich noch ne Frage:

Warum wird bei mir ein kürzel nicht erkann??
Die Abfrage sieht so aus:

SELECT * FROM users,inventar as i,
movies as m INNER JOIN
(Verleihliste as v INNER JOIN i ON v.bar_id=i.bar_id AND v.u_id=1)
ON i.m_id=m.m_id AND m.m_id=1;

die DB meldet:
FEHLER: Relation »i« existiert nicht LINE 3: (Verleihliste as v INNER JOIN i ON v.bar_id=i.bar_id AND v.u…

er erkennt also diese Zeile nicht:
(Verleihliste as v INNER JOIN i ON v.bar_id=i.bar_id AND v.u_id=1)

bzw. das I Kürzel

Du hast die Tabelle einmal zuviel in Deinem Statement, und das erzeugt ein kartesisches Produkt in Deinem Fall.

Siehe: http://www.postgresql.org/docs/current/static/sql-update.html

Das muss also eher so aussehen:

UPDATE verleihliste v
    set enddate = actualDate
FROM inventar 
WHERE v.bar_id = inventar.bar_id)
AND inventar.m_id=1 
and v.u_id=1]

weil das eine ganz andere Ebene der Abfrage ist.


Andreas

Hallo castorp

Das hier:

UPDATE verleihliste v     set enddate = actualDate FROM inventar  WHERE v.bar_id = inventar.bar_id AND inventar.m_id=1  and v.u_id=1;

klappt sehr gut. Danke dir. Eine Frage ich noch. Warum eigentlich FROM???
Ist klar in der syntax steht es aber ich verstehe den sinn nicht.
Wenn ich select mache, dann brauche FROM um zu wissen von welche Tabelle ich select mache. Welchen sinn ergibt das bei UPDATE???
Ist es ebenfalls wie select oder so???

Du kannst das FROM auch weglassen, dafür aber die Werte, die Du aus der Tabelle inventar holst, alle in Dein Update reinfrickeln. Ich glaub nicht, daß Du das willst …


Andreas

Also ich verstehe es so:

UPDATE verleihliste v     set enddate = actualDate FROM inventar  
WHERE v.bar_id = inventar.bar_id AND inventar.m_id=1  and v.u_id=1;

UPDATE verleihliste v set enddate = actualDate

Damit setzt er das datum auf Aktuellesdatum in der Tabelle verleihliste


mit FROM inventar WHERE v.bar_id = inventar.bar_id
schaut er nach alle bar_id die sich im verleihliste und inventar befinden und alle gleich sind und sortiert diese somit aus.

mit AND inventar.m_id=1 and v.u_id=1;
Noch mal aussortieren wo die m_id=1 ist ebenfalls in der verleihliste die m_id=1 ist;


das gleiche mach eich doch mit Inner Join warum klappt es nicht???