SQL Tabelleupdate

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/sql-tabelleupdate_238436/page_1 - zur Vollversion wechseln!


McDeath98 schrieb am 31.03.2014 um 10:20

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: SQL
UPDATE TEST SET TEST.LINK = (SELECT LINK FROM links where TEST.ITEMID=links.ITEMID and SCID=1)

gehen. Der Server meldet mir aber

#1242 - Subquery returns more than 1 row

zurück.

Hab ich irgendwas übersehen ?

Nochmal zusammengefasset:

Tabelle TEST Felder:
LINK (soll geupdated werden)
ITEMID (nicht einzigartig, weil mehrere Subshops)
SCID (Nummer der Untershops)

Tabelle Links Felder:
LINK (der statische Link)
ITEMID (die Artikelnummer des entsprechenden Links)

tia

Greetings


Neo1010 schrieb am 31.03.2014 um 10:36

führ mal die query allein aus

Code: SQL
SELECT LINK, SCID, ITEMID FROM links SCID=1

und schau was als result zurück kommt


McDeath98 schrieb am 31.03.2014 um 10:44

Zitat von Neo1010
führ mal die query allein aus

Code: SQL
SELECT LINK, SCID, ITEMID FROM links SCID=1

und schau was als result zurück kommt

Code: SQL
SELECT LINK, SCID, ITEMID FROM links where SCID="1"

Gibt mir halt alle Datensätzte der Tabelle zurück

Zeige Datensätze 0 - 29 (1.357 insgesamt, die Abfrage dauerte 0.0004 sek)SQL-Befehl:
Code: SQL
SELECT LINK, SCID, ITEMID
FROM links
WHERE SCID =  "1"
LIMIT 0 , 30


-=Willi=- schrieb am 31.03.2014 um 10:51

Meine Query wär jetzt gewesen

Code: SQL
UPDATE Test SET Link = (SELECT Link FROM Links WHERE Links.ItemID = Test.ItemID) WHERE SCID = 1;
Ich hab allerdings das WHERE rausgezogen.

http://sqlfiddle.com/#!2/f4353/1


McDeath98 schrieb am 31.03.2014 um 10:57

Zitat
SQL-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

selber fehler


XXXprod schrieb am 31.03.2014 um 11:00

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: SQL
UPDATE TEST SET TEST.LINK = (SELECT TOP 1 LINK FROM links where TEST.ITEMID=links.ITEMID and SCID=1)


McDeath98 schrieb am 31.03.2014 um 11:01

ist ne Mysql Datenbank


XXXprod schrieb am 31.03.2014 um 11:03

Ok dann so

Code: SQL
UPDATE TEST SET TEST.LINK = (SELECT LINK FROM links where TEST.ITEMID=links.ITEMID and SCID=1 LIMIT 1)


semteX schrieb am 31.03.2014 um 11:05

Deine annahme, dass ItemID und SCID einen unique key bilden ist offensichtlich falsch:

Code: SQL
SELECT count(*) as cnt, ItemID FROM Links GROUP BY ItemID HAVING cnt>1;
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.


XXXprod schrieb am 31.03.2014 um 11:09

Stimmt natürlich! Ich vemute eher inkonsistente (doppelte, veraltete) Datensätze in der Tabelle die eher bereinigt gehören.


McDeath98 schrieb am 31.03.2014 um 11:12

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


McDeath98 schrieb am 31.03.2014 um 12:12

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