在mysql查询上非常奇怪的行为

时间:2012-03-24 14:03:14

标签: 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()

我的问题是,当我执行第一个和第二个查询时,没有任何事情发生,除非我事先删除了我的表中的所有记录。在这种情况下,两个查询都会被执行并像魅力一样工作。

为什么会这样?

1 个答案:

答案 0 :(得分:0)

从我记忆中,你不能插入一个表格,这是一个查询的结果,可能会影响你插入的内容...所以,如果选择被“包裹”,它可能会有帮助在另一个图层中,因此内部查询首先完全处理,因此不会受到插入的影响。

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

是的,基本上是一样的,但可能是解释问题。