Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Bestimmte Teile einer Tabelle in eine andere kopieren / überschreiben

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von pudem, 23 November 2014.

  1. pudem

    pudem Neuer Benutzer

    Hallo,

    Ich bin ein SQL-Anfänger und komme ins Schwimmen mit einem Befehl und komme so nicht weiter.

    Ausgangspunkt ist folgende Tabelle phpcount_hits:

    [​IMG]

    Jetzt möchte ich Teile des Inhaltes in eine andere Tabelle - ich nenne sie phpcount_gesamttabelle - einfügen. Sie sieht so aus:

    [​IMG]

    Und zwar soll der Inhalt von hitcount, wenn unique 1 ist, für die jeweilige rartid in die Spalte "11" eingetragen werden. Die voreingestellte Null soll dabei überschrieben werden. Wenn die entsprechende rartid in der gesamttabelle nicht existiert (in diesem Fall 7), soll sie ignoriert werden. Das Ergebnis sollte dann so aussehen:

    [​IMG]

    Ich habe schon ein bisschen rumprobiert:

    UPDATE phpcount_gesamttabelle
    SET 11=
    ????
    SELECT rartid,hitcount FROM phpcount_hits WHERE (isunique=1)

    Weiter komme ich nicht. Geht das, dass ich das mit einem einzigen SQL-Befehl hinkriege?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Verständlich. Da scheint einiges komplett falsch zu sein. In Deine Ausgangstabelle ist schon mal kein eindeutiger Schlüssel erkennbar. Numerisch durchnummerierte Spalten sind auch ein Indiz für Fehler.

    Vereinfacht gesagt hast Du:

    Code:
    test=# select * from quelle ;
     id | val
    ----+-----
      1 |  10
      2 |  12
    (2 rows)
    
    Time: 0,153 ms
    test=*# select * from ziel;
     id | col
    ----+-----
      1 |
    (1 row)
    
    und suchst

    Code:
    test=*# insert into ziel select * from quelle where id not in (select id from ziel);
    INSERT 0 1
    Time: 0,321 ms
    test=*# update ziel set col = q.val from quelle q where ziel.id=q.id;
    UPDATE 2
    
    das liefert:

    Code:
    test=*# select * from ziel;
     id | col
    ----+-----
      1 |  10
      2 |  12
    (2 rows)
    
    Das war jetzt vereinfacht.

    Okay, ich seh grad: das INSERT kannst Dir wohl sogar sparen, nach Deiner Vorgabe.
     
  3. pudem

    pudem Neuer Benutzer

    Vielen Dank. Das mit der neuen Variable q kannte ich noch nicht. Ich habe das mal auf meinen Fall angewendet und in phpmyadmin als SQL-Zeile eingegeben:

    Code:
    update phpcount_gesamttabelle
    set 11=q.hitcount
    from phpcount_hits q
    where phpcount_gesamttabelle.rartid=q.rartid;
    Da kommt dann folgende Fehlermeldung:
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '11=q.hitcount from phpcount_hits q where phpcount_gesamttabelle.rartid=q.rart' at line 2

    Komisch. Also habe ich Dein vereinfachtes Beispiel komplett nachgebaut. Wenn ich den ersten SQL-Befehl eingebe:

    Code:
    insert into ziel select * from quelle where id not in (select id from ziel);
    Dann geht alles glatt, (es wird in ziel die zweite zeile von quelle kopiert), aber wenn ich den zweiten Befehl eingebe:

    Code:
    update ziel
    set col=q.val
    from quelle q
    where ziel.id=q.id;
    Dann kommt wieder:

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from quelle q where ziel.id=q.id' at line 3

    Das versteh ich jetzt überhaupt nicht! Komisch ist auch, dass die beiden Fehlermeldungen sich auf unterschiedliche Zeilen beziehen (line 2 beim ersten Bsp. und line3 beim zweiten)
     
    Zuletzt bearbeitet: 23 November 2014
  4. pudem

    pudem Neuer Benutzer

    Nachtrag:

    Du hattest Recht mit den nummerischen Spaltennamen: Wenn ich "11" in "m11" umbenenne, dann kommt auch die Fehlermeldung, allerdings für Zeile 3, d.h. das Problem liegt in der Zeile

    Code:
    from phpcount_hits q
    
    Aber was ist da falsch?
     
  5. akretschmer

    akretschmer Datenbank-Guru

    MySQL. Das ist sprachbehindert und versteht SQL gemäß der SQL-Spezifikation manchmal nicht und manchmal falsch.

    Du suchst sowas wie

    Code:
    update ziel,quelle set ziel.val=quelle.val where quelle.id=ziel.id;
    
    Zu den nummerierten Spalten: da ein 'm' vorzuschreiben mag gegen den Syntaxfehler helfen, das ginge aber auch durch Quoting. Das Problem ist der Aufbau der Tabellen. Du hast 12 Spalten, weil es 12 Monate gibt. Wenn Du das nach dem Schema für jeden Tag eines Jahres machen willst brauchst 365,25 Spalten, soll es für 10 Jahre reichen dann 3652,5 Spalten. Und da ist es noch einfach, was machst Du du, wenn Du für jeden Kunden eine Spalte haben willst? Du siehst also, das kann so nicht richtig funktionieren. Dafür wurden die Regeln der Normalisierung geschaffen. Die gelten auch für MySQL.

    Ach ja: Du bist Anfänger, vielleicht ist es ja noch nicht zu spät Dich vor MySQL zu warnen und Dir bessere Alternativen wie z.B. PostgreSQL zu empfehlen.
     
  6. pudem

    pudem Neuer Benutzer

    Danke für den Code. Angewendet für meinen Fall wäre das dann:

    Code:
    update phpcount_gesamttabelle,phpcount_hits set phpcount_gesamttabelle.m11=phpcount_hits.hitcount where (phpcount_hits.rartid=phpcount_gesamttabelle.rartid) AND (phpcount_hits.isunique=1);
    
    So funzt es. Super!

    Die Fälle, die Du beschrieben hast, treffen für mich nicht zu. "Kunden" gibt es bei mir nicht - es geht um eine Statistik, die auf Monatsbasis (Tagesbasis eräbe kaum einen Sinn) laufen soll, d.h. an der Struktur wird sich nichts ändern. Die Jahre kriege ich ja über die Zeilen.

    Was "Normalisierung" und "Quoting" ist, weiß ich nicht. Ehrlich gesagt wurschtel ich immer so lange rum, bis es funktioniert . weiter gehe ich nicht. Auch was an PostgreSQL besser sein soll als MySQL - keinen Schimmer (Ich hab mal was von fehlender "refentieller Integrität" bei MySQL gehört und kann mir sogar was drunter vorstellen, aber so einfach wie meine Daten aufgebaut sind, brauche ich das nicht)! Aber ein Profi wie Du wird schon seine Gründe haben! Fakt ist aber, dass alle Provider in erster Linie MySQL anbieten, das ist ja Quasistandard. Bisher hatte ich damit auch keine Probleme. Also kann es soooo schlecht ja auch nicht sein.
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Bitte.

    Daran solltest Du arbeiten, dies zu ändern.

    Sehr vieles. Du wirst es merken, wenn Du eines Tages mal vom Niveau des rumwurschteln höher kommen willst.

    Das kann es mittlerweile sogar, also in InnoDB, und wenn man es gezielt nutzt. Also nicht nur rumwurschtelt.

    Ich arbeite bei einem Provider, und ja, sehr viele nutzen MySQL. Und ich sehe auch, welche Probleme insbesondere bei wachsenden Projekten damit bestehen. Von daher kommt dann auch meine Einstellung.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden