URL: https://www.overclockers.at/coding-stuff/sql-tabelleupdate_238436/page_1 - zur Vollversion wechseln!
Hallo
Ich hab das vor Jahren schon mal gemacht und danach nie wieder benötigt.
Ich habe folgendes Problem.
Ich habe auf unserem Onlineshop (nicht über die Software fluchen, ich weiss das Sie Schrott ist, siehe anderer Thread) die mittels cgi arbeitet.
Das bereitet aber in vielen Situationen Probleme. Online Indexierung, Preisportale etc.
Die aktuellen Daten stehen in der Tabelle TEST. Leider sind dort keine statischen Links hinterlegt, was ein erstellen von csv's unmöglich macht.
Mein Script zu erstellen des Files steht, und ich habe eine 2te Tabelle angelegt, in welcher die statischen Links stehen.
nun möchte ich folgendes machen.
In der Tabelle TEST möchte ich das Feld LINK updaten, mit den Daten aus der Tabelle links. Um sicherzustellen, das auch der richtige Artikel den richtigen URL bekommt, habe ich 2 Parameter. Zum einen die SCID (SCID = 1 ist der Shop den ich Updaten möchte) was die ID des Untershops ist, zum anderen die Artikelnummer.
Eigentlich müsste es doch relativ einfach, mit dem Script
Code: SQLUPDATE TEST SET TEST.LINK = (SELECT LINK FROM links where TEST.ITEMID=links.ITEMID and SCID=1)
führ mal die query allein aus
Code: SQLSELECT LINK, SCID, ITEMID FROM links SCID=1
Zitat von Neo1010führ mal die query allein ausCode: SQLSELECT LINK, SCID, ITEMID FROM links SCID=1
und schau was als result zurück kommt
Code: SQLSELECT LINK, SCID, ITEMID FROM links where SCID="1"
Code: SQLSELECT LINK, SCID, ITEMID FROM links WHERE SCID = "1" LIMIT 0 , 30
Meine Query wär jetzt gewesen
Ich hab allerdings das WHERE rausgezogen.Code: SQLUPDATE Test SET Link = (SELECT Link FROM Links WHERE Links.ItemID = Test.ItemID) WHERE SCID = 1;
ZitatSQL-Befehl: Dokumentation
UPDATE TEST SET LINK = ( SELECT LINK
FROM links
WHERE links.ITEMID = TEST.ITEMID )
WHERE SCID =1;
MySQL meldet: Dokumentation
#1242 - Subquery returns more than 1 row
Hallo McDeath98,
ich lese leider nicht raus auf welcher Datenbank du die Abfrage ausführen willst aber ich vermute das dies eh Standard-SQL ist. Die Abfrage funktioniert nicht, weil dein SubSelect mehr als eine Zeile zurück gibt. Das Bedeutet, dass in deiner Tabelle Links für zumindest 1 Item mehr als 1 Link angelegt ist. Wie auch immer - damit diese Abfrage so funktioniert musst du es hinbekommen nur 1 Link pro Item zu erhalten.
Möglichkeit:
- Tabelle Links bereinigen, falls sich irrtümlicher weise doppelte Links pro Item darin befinden,
- SubQuery mittels extra Parameter auf 1 Result pro Item reduzieren
- oder mittels "TOP 1"(SQL Server) die Abfrage auf 1 Result limitieren.
Lg, XXX
//Edit Beispiel mit TOP(SQL Server):
Code: SQLUPDATE TEST SET TEST.LINK = (SELECT TOP 1 LINK FROM links where TEST.ITEMID=links.ITEMID and SCID=1)
ist ne Mysql Datenbank
Ok dann so
Code: SQLUPDATE TEST SET TEST.LINK = (SELECT LINK FROM links where TEST.ITEMID=links.ITEMID and SCID=1 LIMIT 1)
Deine annahme, dass ItemID und SCID einen unique key bilden ist offensichtlich falsch:
edit: das problem "ich bekomm mehr retour als ich mir erwarte" mit einem "LIMIT 1" zu erschlagen is so ziemlich der schnellste weg in die Hölle.Code: SQLSELECT count(*) as cnt, ItemID FROM Links GROUP BY ItemID HAVING cnt>1;
Stimmt natürlich! Ich vemute eher inkonsistente (doppelte, veraltete) Datensätze in der Tabelle die eher bereinigt gehören.
In der Tabelle Test kommt die Artikelnummer mehrfach vor und auch die SCID.
In der Kombination kommen beide Werte aber genau 1 mal vor, da ein Artikel in einem Subshop nur 1 mal vorhanden sein kann.
Aber du hattest recht. Beim erstellen der links Tabelle haben sich wohl mehrere doppelt eingeschlichen. Keine Ahnung, wie das passieren kann, aber ich bereinige mal die doppelten und melde mich nochmals.
Danke erstmal
War tatsächlich das Problem. Irgendwie ham die bei den letzten Shop Arbeiten *******e gebaut, und ein paar Files mehrfach hochgeladen.
Dank euch
ps: mein Script war doch richtig
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025