SQL Update mit Select

mosquito87

Lieutenant
Registriert
Aug. 2006
Beiträge
980
Hi zusammen,

in folgender Tabelle will ich die rechte Spalte (Lagerposition) updaten/ändern:

Code:
+-----+--------------+----------+----------------------+
| ID  | FK_ARCHIVBOX | FK_PAKTE |    Lagerposition     |
+-----+--------------+----------+----------------------+
| 113 |            2 |      133 | Ergebnis nach Update |
| 114 |            2 |      134 | Ergebnis nach Update |
| 117 |           62 |      137 | Ergebnis nach Update |
+-----+--------------+----------+----------------------+

Die Werte, die in diese Spalte müssen, bekomme ich über ein SELECT Statement:
Code:
SELECT
  LAGERRAUM.NUMMER, LAGERREGAL.NUMMER, LAGERFACH.NUMMER, ARCHIVBOX.NUMMER
FROM
  LAGERPLATZ, ARCHIVBOX, LAGERFACH, LAGERREGAL, LAGERRAUM
WHERE
  ARCHIVBOX.ID = LAGERPLATZ.FK_ARCHIVBOX AND
  LAGERFACH.ID = ARCHIVBOX.FK_LAGERFACH AND
  LAGERREGAl.ID = ARCHIVBOX.FK_LAGERREGAL AND
  LAGERRAUM.ID = ARCHIVBOX.FK_LAGERRAUM

Problem:
Das SELECT gibt mir logischerweise mehrere Zeilen zurück, da es viele Lagerpositionen gibt.

Ich muss noch filtern nach LAGERPLATZ.FK_PAKTE.

Z. B.:
Code:
SELECT
  LAGERRAUM.NUMMER, LAGERREGAL.NUMMER, LAGERFACH.NUMMER, ARCHIVBOX.NUMMER
FROM
  LAGERPLATZ, ARCHIVBOX, LAGERFACH, LAGERREGAL, LAGERRAUM
WHERE
  LAGERPLATZ.FK_PAKTE = 133 AND
  ARCHIVBOX.ID = LAGERPLATZ.FK_ARCHIVBOX AND
  LAGERFACH.ID = ARCHIVBOX.FK_LAGERFACH AND
  LAGERREGAl.ID = ARCHIVBOX.FK_LAGERREGAL AND
  LAGERRAUM.ID = ARCHIVBOX.FK_LAGERRAUM

Die 133 muss jetzt aber noch dynamisch durch die Zahl in der Spalte FK_PAKTE ersetzt werden, andem sich der Update Befehl gerade befindet (erst 133, dann 134, dann 137).

Wie geht das?
 
Code:
WHERE
  LAGERPLATZ.FK_PAKTE IN (
    SELECT FK_PAKTE
    FROM LAGERPLATZ
    ...
  ) AND
  ...
edit: Sehr schön wie der Post zerpflückt wurde... -.- Stichwort heißt Subquery.
 
Ja, so hab ich es auch schon probiert:

Code:
UPDATE LAGERPLATZ 
SET LAGERPOSITION = (SELECT
  CONCAT(LAGERRAUM.NUMMER, CONCAT('.', CONCAT(LAGERREGAL.NUMMER, CONCAT('.', CONCAT(LAGERFACH.NUMMER, CONCAT('.', ARCHIVBOX.NUMMER))))))
FROM
  LAGERPLATZ, ARCHIVBOX, LAGERFACH, LAGERREGAL, LAGERRAUM
WHERE
  LAGERPLATZ.FK_PAKTE IN (SELECT FK_PAKTE FROM LAGERPLATZ) AND
  ARCHIVBOX.ID = LAGERPLATZ.FK_ARCHIVBOX AND
  LAGERFACH.ID = ARCHIVBOX.FK_LAGERFACH AND
  LAGERREGAl.ID = ARCHIVBOX.FK_LAGERREGAL AND
  LAGERRAUM.ID = ARCHIVBOX.FK_LAGERRAUM)

Ohne Erfolg. :(
 
Ohne Erfolg heißt was?
Syntaxfehler oder semantischer Fehler?
 
distinct könnte auch mehrere Ergebnisse zurück liefern, daher würde ich raten das subquery wirklich so zu bauen das nur ein wert möglich ist, eben mit where Bedingungen oder wenn es nicht anders geht ein limit 1 (oder bei MS-SQL top 1) zu setzen. Dann wird immer nur die erste Zeile berücksichtigt, das kann oder kann nicht gewollt sein.
 
Distinct gibt immer nur ein Wert zurück, außer es ist eine GROUP BY-Klausel dabei.

Aber BTW:
Laut MySQL-Doku darfst du keine Subquerys auf Daten machen, die du gerade veränderst.
Das führt dann zu deiner Lösung mit einer temporären Tabelle.
Funktioniert das?
Code:
UPDATE LAGERPLATZ  as l1,LAGERPLATZ as l2 , ARCHIVBOX, LAGERFACH, LAGERREGAL, LAGERRAUM 
SET l1.LAGERPOSITION = CONCAT(LAGERRAUM.NUMMER, '.', LAGERREGAL.NUMMER, '.', LAGERFACH.NUMMER, '.', ARCHIVBOX.NUMMER) 
WHERE  
l2.FK_PAKTE = l1.FK_PAKTE 
AND  ARCHIVBOX.ID = l2.FK_ARCHIVBOX 
AND  LAGERFACH.ID = ARCHIVBOX.FK_LAGERFACH 
AND LAGERREGAL.ID = ARCHIVBOX.FK_LAGERREGAL 
AND  LAGERRAUM.ID = ARCHIVBOX.FK_LAGERRAUM
(Bei mir kommt nur das obligatorische "Table doesn't exists", also ist's wenigstens valides SQL :) )
 
Distinct gibt immer nur ein Wert zurück, außer es ist eine GROUP BY-Klausel dabei.

Nö, distinct schmeißt nur doppelte Einträge raus sobald unterschiedliche Daten vorhanden sind gibt es 2 oder mehr Einträge zurück. Distinct ist also bei weitem keine Garantie das nur 1 Datensatz zurück kommt group by hin oder her.
 
Zurück
Oben