2012-03-24 84 views
0

我有两个查询。mysql查询很怪异的行为

第一个是..

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" 

,另一种是..

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() 

我的问题是,当我执行的第一和第二查询什么都不会发生,除非我删除所有记录我的桌子。在这种情况下,两个查询都被执行并且像魅力一样工作。

这是怎么发生的?

+0

我已经更新了我的文章! – 2012-03-24 14:07:53

+2

您有任何专栏吗?这将解释为什么这只能工作一次。 – 2012-03-24 14:12:10

+0

在桌子上balik(balik_date,balik_time,balik_cardID)是我的PK和桌子上的logdetail(L_Date,L_Time,L_CardID)是我的PK ...谢谢你的答复.. – 2012-03-24 14:27:28

回答

0

从我记得,你不能做一个插入到一个查询的结果,可能是你插入的影响...所以,它可能会帮助,如果选择“包装“在另一个图层内,所以内部查询完全处理FIRST,因此不会受到插入的影响。

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 

我会改变对更新的语法更加紧密地匹配每个文档的SQL语法的......列出逗号分隔的表,然后应用在WHERE子句

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() 

加盟条件是的,本质上是一样的,但可能是解释问题。

+0

嗨@DRapp ...非常感谢你......我欠你......谢谢你的解释。以及...查询工作正常! :) – 2012-03-25 03:38:21

+0

@ApizZest,欢迎你...直到今天,我也一直在学习。 – DRapp 2012-03-25 11:54:35