2012-03-24 6 views
0

Ich habe zwei Abfragen.sehr seltsames Verhalten auf MySQL-Abfrage

Die erste ist ..

INSERT INTO balik 
    (balik_date, 
     balik_time, 
     balik_cardID, 
     balik_status, 
     balik_type) 
    select 
     current_date(), 
     '00:00:00', 
     L_CardID, 
     'BELUM BALIK', 
     L_Type 
     FROM 
     logdetail t1 
      LEFT JOIN balik t2 
       ON t1.L_CardID = t2.balik_cardID 
     WHERE 
      t1.L_Type = 'IN' 
     and t1.L_Date = current_date() 
     AND t2.balik_cardID IS NULL" 

und ein anderer ist ..

UPDATE balik blk 
    INNER JOIN logdetail ld 
     ON blk.balik_cardID = ld.L_CardID 
    and blk.balik_date = current_date() 
    SET 
     blk.balik_status = 'SUDAH BALIK', 
     blk.balik_type = 'OUT', 
     blk.balik_time = ld.L_Time 
    WHERE 
      ld.L_Type = 'OUT' 
     and ld.L_Date = current_date() 

Mein Problem ist, dass, wenn ich die erste und die zweite Abfrage nichts ausführen passiert, wenn ich nicht alle Datensätze löschen in mein Tisch vorher. In diesem Fall werden beide Abfragen ausgeführt und funktionieren wie ein Charm.

Warum passiert das?

+0

Ich habe bereits meinen Beitrag aktualisiert! –

+2

Sind irgendwelche Spalten Sie einzigartig? Das würde erklären, warum das nur einmal funktioniert. –

+0

auf Tabelle balik (balik_date, balik_time, balik_cardID) sind meine PK und auf Tabelle logdetail (L_Date, L_Time, L_CardID) sind meine PK ... danke für die Antwort .. –

Antwort

0

Von was ich erinnere, können Sie nicht einfügen in eine Tabelle, die das Ergebnis einer Abfrage ist, die eine Auswirkung dessen sein können, was Sie einfügen ... So könnte es helfen, wenn die Auswahl wurde "umhüllt "innerhalb einer anderen Schicht, so dass die innere Abfrage vollständig zu FIRST verarbeitet wird und somit nicht von den Einfügungen beeinflusst wird.

INSERT INTO balik 
    (balik_date, 
     balik_time, 
     balik_cardID, 
     balik_status, 
     balik_type) 
    select 
     PreQuery.newDate, 
     PreQuery.newTime, 
     PreQuery.newCardID, 
     PreQuery.newStatus, 
     PreQuery.newType 
     from 
     (select 
       current_date() newDate, 
       '00:00:00'  newTime, 
       L_CardID  newCardID, 
       'BELUM BALIK' newStatus, 
       L_Type   newType 
       FROM 
       logdetail t1 
        LEFT JOIN balik t2 
         ON t1.L_CardID = t2.balik_cardID 
       WHERE 
        t1.L_Type = 'IN' 
       and t1.L_Date = current_date() 
       AND t2.balik_cardID IS NULL") PreQuery 

würde ich die Syntax auf das Update ändern, um genauer pro Dokumentation, dass der SQL-Syntax übereinstimmen ... die Tabellen Komma getrennt, gelten dann Join-Bedingungen in der WHERE-Klausel

UPDATE balik blk, logdetail ld 
    SET 
     blk.balik_status = 'SUDAH BALIK', 
     blk.balik_type = 'OUT', 
     blk.balik_time = ld.L_Time 
    WHERE 
     blk.balik_cardID = ld.L_CardID 
    and blk.balik_date = current_date() 
    and ld.L_Type = 'OUT' 
    and ld.L_Date = current_date() 

Ja, im Wesentlichen das Gleiche, aber vielleicht auch Interpretationsprobleme.

+0

Hallo @DRapp ... vielen Dank ... ich schulde dir ... Danke für die Erklärung als gut ... die Abfrage funktioniert gut! :) –

+0

@ApizZest, du bist willkommen ... Bis heute lerne ich auch noch. – DRapp