Zum Inhalt springen

Update mit Where-klausel zwischen verschiedenen Tabellen


ripley_one

Empfohlene Beiträge

Hallo liebes Forum,

stehe als blutige Anfängerin vor einem Scherbenhaufen::old

Ich habe eine Datenbank mit vielen Tabellen darin. Nun möchte ich eine Spalte (produkt_name) der Tabelle (produkt_beschreibung) um einen Text (Adidas) ergänzen, so dass der produkt_name um das Wort "Adidas" erweitert wird (der übrige Teil des Datensatzes soll erhalten bleiben, nicht überschrieben werden).

Das allein wäre nicht unbedingt ein Problem... glaube ich...

Jetzt kommt allerdings die WHERE Klausel. Dies soll nämlich nur für alle die Produkte geschehen, die in einer anderen Tabelle (produkte) in der spalte (hersteller_id) den Wert "2" besitzen (die 2 steht in diesem Fall für Adidas). Beide Tabellen besitzen die Spalte produkt_id.

Folgende Lösungen habe ich probiert und bin gescheitert:

UPDATE produkt_beschreibung, produkte

SET produkt_beschreibung.produkt_name = concat("Adidas"," ",produkt_name)

WHERE produkt_beschreibung.produkt_id = produkte.produkt_id AND produkte.hersteller_id=2

UPDATE produkt_beschreibung

SET produkt_name = concat("Adidas"," ",produkt_name)

WHERE produkt_id = (SELECT produkt_id FROM produkte WHERE hersteller_id=2)

Irgendwie scheint die Abfrage kein Ergebnis zu liefern... oder aber zu viele. Wie kann ich für ALLE in Frage kommenden Produkte den Namen entsprechend aktualisieren?

Bin für jeden Tipp dankbar!

Viele Grüße!

*rip*

Link zu diesem Kommentar
Auf anderen Seiten teilen

Lieben Dank für eure Hilfe. ....Genau das scheint mein Problem zu sein zu viele Datensätze... Leider funktioniert es mit dem Austausch von = durch IN auch nicht. Immernoch "keine Datensätze". Hab gelesen, dass es bei einer INNEREN(?) SELECT Anweisung immer nur einen Datensatz gegen darf, der ausgegeben wird... das is ja bei mir nich der Fall...

Bearbeitet von ripley_one
Link zu diesem Kommentar
Auf anderen Seiten teilen

AHHHHHHHHHH!

Kommando: ZURÜCK!

Es hat schon 8x geklappt... zum Testen hatte ich den Dumper genutzt und der bemerktr immer "keine Datensätze".. schienbar hatte er aber im Hintergrund den Befehl ordnungsgemäß ausgeführt. Nun hab ich 8x Adidas vor meinen Artikeln stehen. OK! Aber in der der realen Datenbank hab ich den Befehl einmal ausgeführt... Ergebnis:

2603 Zeile(n) betroffen. ( die Abfrage dauerte 1.7498 sek. )

UPDATE xt_products_description

SET products_name = concat( "Adidas", " ", products_name )

WHERE products_id IN (

SELECT products_id

FROM xt_products

WHERE manufacturers_id =2

)

:upps

Herzlichen Dank für die Lösung!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Produkte haben IDs und Hersteller haben IDs. Adidas hat die ID 2 und beispielsweise K2 hat die ID 14. Was ist daran unlogisch?

Ich führe den Befehl einmal! aus (im SQL Fenster bei MySQL) und der Produktname erhält z.B. "Adidas Adidas Adidas Adidas Adidas Adidas Adidas Adidas T-Shirt, Farbe: Blau" als Namen. Es soll doch aber nur einmal eingefügt werden das Wort Adidas... Was sorgt dafür, dass es gleich 8x eingefügt wird?

was heißt commit?

Link zu diesem Kommentar
Auf anderen Seiten teilen

SQL arbeitet mengenorientiert. Du bekommst in deinem Subselect eine Menge x von IDs und für jede dieser IDs wird der Updatebefehl einmal in der angegebenen Menge durchlaufen. In deinem Fall eben 8 mal.

was heißt commit?

Oh je. Ich weiß Du bist Einsteiger in dem Bereich, aber das ist in etwa so, wie wenn ein Führerscheinneuling frägt, was der Tankdeckel ist.

Mit Commit schreibst Du die Änderungen die Du gmeacht hast in der Datenbank fest. Das Gegenteil wäre ein Rollback, der die Änderungen wieder auf den vorherigen Stand zurückfährt.

Zu Deinem eigentlichen Problem:

Du benötigst das, was man eine korrelierte Subquery nennt:

UPDATE xt_products_description a

SET a.products_name = (select concat( "Adidas", " ", a.products_name ) 

                         from xt_products b

                        where a.products_id=b.products_id

                          and b.manufacturers_id =2) 

WHERE products_id IN (

SELECT products_id

  FROM xt_products

 WHERE manufacturers_id =2)

Damit wird zum einen eine Verknüpfung zwischen der zu ändernden Sätzen und der Lookuptabelle hergestellt (Subquery), zum anderen wird in der äußeren WHERE Klausel die überhaupt zu bearbeitende Menge in xt_products_description eingeschränkt.

Würde die äußere WHERE Klausel wegbleiben, würde dieses UPDATE alle Beschreibungen auf NULL setzen, die in der Subquery keine Entsprechung finden.

Des weiteren empfehle ich Dir (und vielleicht auch einigen anderen) dringend dieses Buch

Dim

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich dachte ich grenze die IDs ein indem ich:

WHERE manufacturers_id =2
eingebe. Setze ich damit nicht fest, dass nur die product_name mit der ID 2 das Wort Adidas eingefügt bekommen sollen? Wieso muss ich noch die IDs über:
where a.products_id=b.products_id

beschreiben?

Sorry. Wenns zu kompliziert ist, oder zu simpel... aber ich möchts gern vestehen. Hatte mir das Buch auch schon herausgesucht. war mir aber noch uneins ob ich dein vorgeschlagenes oder dieses bestelle. Vielen Dank für deinen Tipp! Werds mir auf jeden Fall besorgen. Dann hören irgendwann diese Knäckebrotfragen Fragen auf!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...