tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von CPoly
  • 1 Beitrag von CPoly
ERLEDIGT
JA
ANTWORTEN
12
ZUGRIFFE
324
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    null_plan null_plan ist offline Mitglied Bronze
    Registriert seit
    Jun 2010
    Beiträge
    25
    Hallo Forum,

    ich möchte eine Tabelle mit neuen Datensätzen aus einer anderen Tabelle erweitern aber irgendwie bekomme ich das nicht auf die Reihe.

    Folgendes hab ich mir zusammen gebastelt:

    INSERT INTO
    hersteller
    SET
    shop_iD = 1,
    Hersteller_ID = NULL,
    ADDR_ID = -1,
    HERSTELLER_NAME =
    SELECT
    update.hersteller_name
    FROM
    update
    LEFT JOIN
    hersteller
    ON
    update.HERSTELLER_NAME = hersteller.HERSTELLER_NAME
    WHERE hersteller.HERSTELLER_ID IS NULL,
    HERSTELLER_IMAGE = NULL,
    LAST_CHANGE = NOW(),
    SHOP_DATE_ADDED = NULL,
    SHOP_DATE_CHANGE = NULL,
    CHANGE_FLAG = 'Y',
    DEL_FLAG = 'N';

    Leider funktioniert das so nicht, ich hoffe mir kann jemand einen Tip geben wie ich die Sache richtig angehe.
     

  2. #2
    FrankBooth FrankBooth ist offline Mitglied Gold
    Registriert seit
    Sep 2008
    Ort
    Osnabrück (Niedersachsen)
    Beiträge
    244
    Hallo,

    schau mal hier:

    hier
     
    Programmieren ist ein Wettbewerb zwischen dem Programmierer,
    die Software idiotensicher zu machen, und dem Universum, das versucht,
    größere Idioten zu produzieren. Bis jetzt gewinnt das Universum.

  3. #3
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Es gibt zwar eine INSERT ... SET Syntax, aber ich glaube nicht in Kombination mit SELECT. Dort lautet die Syntax etwas anders.
    Versuch mal folgendes

    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    INSERT INTO hersteller
    (shop_iD, Hersteller_ID, ADDR_ID, HERSTELLER_NAME)
    SELECT
    1, NULL, -1 `update`.hersteller_name
    FROM `update`
    LEFT JOIN hersteller ON
    `update`.HERSTELLER_NAME = hersteller.HERSTELLER_NAME
    WHERE hersteller.HERSTELLER_ID IS NULL,
    HERSTELLER_IMAGE = NULL,
    LAST_CHANGE = NOW(),
    SHOP_DATE_ADDED = NULL,
    SHOP_DATE_CHANGE = NULL,
    CHANGE_FLAG = 'Y',
    DEL_FLAG = 'N';

    Eine Fehlermeldung wäre übrigens interessant gewesen.
    Und wer kam auf die Idee die Tabelle "update" zu nennen? Eventuell muss das in backticks gefasst werden: `update`

    EDIT: Folgende WHERE Bedingung wird wohl nie eintreffen: LAST_CHANGE = NOW()
    Geändert von CPoly (01.07.10 um 10:10 Uhr)
     

  4. #4
    null_plan null_plan ist offline Mitglied Bronze
    Registriert seit
    Jun 2010
    Beiträge
    25
    @CPoly
    Ich habe deinen Code mal lauffähig gemacht:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
     INSERT INTO
        hersteller 
                           (shop_iD, Hersteller_ID, ADDR_ID, HERSTELLER_NAME, HERSTELLER_IMAGE, LAST_CHANGE, SHOP_DATE_ADDED, 
                             SHOP_DATE_CHANGE, CHANGE_FLAG, DEL_FLAG)  
    SELECT
        1, NULL, -1, 
        
            (SELECT 
                t_update.hersteller_name 
            FROM 
                t_update 
            LEFT JOIN 
                hersteller 
            ON 
                t_update.HERSTELLER_NAME = hersteller.HERSTELLER_NAME
                WHERE hersteller.HERSTELLER_ID IS NULL),
        NULL, NOW(), NULL, NULL, 'Y', 'N';

    Jetzt hängt er mir zwar einen Datensatz an aber HERSTELLER_NAME bleibt leer.
    Hast Du noch eine Idee?
     

  5. #5
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Dann liefert die innere Abfrage wohl keinen Wert zurück. Also musst du prüfen, ob
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    SELECT 
                t_update.hersteller_name 
            FROM 
                t_update 
            LEFT JOIN 
                hersteller 
            ON 
                t_update.HERSTELLER_NAME = hersteller.HERSTELLER_NAME
                WHERE hersteller.HERSTELLER_ID IS NULL

    Genau eine Zeile liefert. Um auch mehrere auf einmal einzutragen, musst du es so schreiben wie ich (nur ein SELECT, dass innere ist unnötig).
     

  6. #6
    null_plan null_plan ist offline Mitglied Bronze
    Registriert seit
    Jun 2010
    Beiträge
    25
    OK, das mit dem leeren Eintrag war mein Fehler
    Wenn ich es so schreibe wie du es vorschlägst erhalte ich einen "Syntax Error near Hersteller_Image...."
    Und mein Query bringt die Fehlermeldung daß mehr als eine Zeile eingelesen werden soll.
    Geändert von null_plan (01.07.10 um 13:43 Uhr)
     

  7. #7
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Nutz doch bitte die sql-Tags, wegen des syntax highlighting

    Zitat Zitat von null_plan Beitrag anzeigen
    Wenn ich es so schreibe wie du es vorschlägst erhalte ich einen "Syntax Error near Hersteller_Image...."
    Ja, weil die Bedingungen nicht mit Komma, sondern z.B. mit AND verbunden werden müssen. Ich schreib mal dein zuletzt genanntes Query um (Denk daran, es so ab zu ändern, dass auch mindestens eine Zeile als Ergebnis der Abfrage kommt):

    Code sql:
    1
    2
    3
    4
    
    INSERT INTO hersteller (shop_iD, Hersteller_ID, ADDR_ID, HERSTELLER_NAME, HERSTELLER_IMAGE, LAST_CHANGE, SHOP_DATE_ADDED, SHOP_DATE_CHANGE, CHANGE_FLAG, DEL_FLAG)
    SELECT  1, NULL, -1, t_update.hersteller_name, NULL, NOW(), NULL, NULL, 'Y', 'N' FROM t_update
    LEFT JOIN hersteller ON t_update.HERSTELLER_NAME = hersteller.HERSTELLER_NAME
    WHERE hersteller.HERSTELLER_ID IS NULL

    Sollte jetzt mit beliebig vielen Zeilen funktionieren.
    null_plan bedankt sich. 

  8. #8
    null_plan null_plan ist offline Mitglied Bronze
    Registriert seit
    Jun 2010
    Beiträge
    25
    Jetzt kapier ich das ganze

    Eine Frage hab ich jetzt noch, wie kann man verhindern daß ein leerer Datensatz angehängt wird (ich denke da z.B. an meinen Fehler).

    Nutz doch bitte die sql-Tags, wegen des syntax highlighting
    Großes ? meinerseits, ich hab hier nur Code, HTML und PHP oder was meinst DU?
     

  9. #9
    Maik Tutorials.de Gastzugang
    Hi,
    Zitat Zitat von null_plan Beitrag anzeigen
    Großes ? meinerseits, ich hab hier nur Code, HTML und PHP oder was meinst DU?
    CPoly spricht von dem [sql] [/sql]-Tag, der sich, wie auch weitere andere Highlight-Tags, im Editor so nicht findet.

    mfg Maik
     

  10. #10
    null_plan null_plan ist offline Mitglied Bronze
    Registriert seit
    Jun 2010
    Beiträge
    25
    Danke Maik, werde mich in Zukunft daran halten.
     

  11. #11
    Maik Tutorials.de Gastzugang
    [highlight=sql] [/highlight] ist hier ebenso möglich.

    Nach "highlight=" lässt sich der Name der Sprache angeben.

    mfg Maik
     

  12. #12
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Zitat Zitat von null_plan Beitrag anzeigen
    Eine Frage hab ich jetzt noch, wie kann man verhindern daß ein leerer Datensatz angehängt wird (ich denke da z.B. an meinen Fehler).
    Falls du mit "leer" meinst, dass "t_update.hersteller_name" NULL ist, musst du das eben in der WHERE Bedingung noch ausschließen. Vielleicht hilft es auch, bei LEFT JOIN das Wort LEFT zu entfernen. Hier zu der Auszug aus der Dokumentation:
    Ist für die rechte Tabelle im ON- oder USING-Teil eines LEFT JOIN kein passender Datensatz vorhanden, dann wird für die rechte Tabelle ein Datensatz verwendet, bei dem alle Spalten auf NULL gesetzt sind.
    http://dev.mysql.com/doc/refman/5.1/de/join.html

    Ohne left:
    Code sql:
    1
    2
    3
    4
    
    INSERT INTO hersteller (shop_iD, Hersteller_ID, ADDR_ID, HERSTELLER_NAME, HERSTELLER_IMAGE, LAST_CHANGE, SHOP_DATE_ADDED, SHOP_DATE_CHANGE, CHANGE_FLAG, DEL_FLAG)
    SELECT  1, NULL, -1, t_update.hersteller_name, NULL, NOW(), NULL, NULL, 'Y', 'N' FROM t_update
    JOIN hersteller ON t_update.HERSTELLER_NAME = hersteller.HERSTELLER_NAME
    WHERE hersteller.HERSTELLER_ID IS NULL

    Das gleiche nochmal, aber mit anderer Join-Syntax (finde ich in dem Fall angenehmer zu lesen)
    Code sql:
    1
    2
    3
    
    INSERT INTO hersteller (shop_iD, Hersteller_ID, ADDR_ID, HERSTELLER_NAME, HERSTELLER_IMAGE, LAST_CHANGE, SHOP_DATE_ADDED, SHOP_DATE_CHANGE, CHANGE_FLAG, DEL_FLAG)
    SELECT  1, NULL, -1, t_update.hersteller_name, NULL, NOW(), NULL, NULL, 'Y', 'N' FROM t_update, hersteller
    WHERE t_update.HERSTELLER_NAME = hersteller.HERSTELLER_NAME AND hersteller.HERSTELLER_ID IS NULL
    null_plan bedankt sich. 

  13. #13
    null_plan null_plan ist offline Mitglied Bronze
    Registriert seit
    Jun 2010
    Beiträge
    25
    Super, vielen Dank für deine Hilfe.
     

Ähnliche Themen

  1. mysql INSERT INTO Problem
    Von buzzom im Forum PHP
    Antworten: 3
    Letzter Beitrag: 28.06.08, 15:35
  2. mysql insert problem
    Von luchs3 im Forum PHP
    Antworten: 5
    Letzter Beitrag: 29.05.06, 16:11
  3. [VBNET]Problem mit MySQL INSERT
    Von port11 im Forum Visual Basic 6.0
    Antworten: 1
    Letzter Beitrag: 10.02.05, 10:03
  4. MySQL - Insert-Problem
    Von NetPerformance im Forum PHP
    Antworten: 7
    Letzter Beitrag: 20.04.04, 18:08
  5. MySQL - Insert Problem !
    Von NetPerformance im Forum PHP
    Antworten: 2
    Letzter Beitrag: 19.04.04, 16:07