select case when b.a_other_field1  is null then a.a_other_field1  else b.a_other_field1  end as 字段1, ...from a left join b on b.a_key1=a.a_key1 and b.a_key2=a.a_key2

解决方案 »

  1.   

    select a.a_key1 ,a.a_key2 ,case when b.a_other_field1  is null then a.a_other_field1  else b.a_other_field1  end as 字段1, ...
    --其他字段用同樣方法處理
    from a left join b on b.a_key1=a.a_key1 and b.a_key2=a.a_key2
      

  2.   

    :) 似乎没有反应出“如果b表中对a中的某一记录有两次或两次以上更新,那么根据update_time取大的作为有效数据”这一条件哦!
      

  3.   

    select a.a_key1 ,a.a_key2 ,case when b.a_other_field1  is null then a.a_other_field1  else b.a_other_field1  end as 字段1, ...
    --其他字段用同樣方法處理
    from a left join

    (SELECT A.a_key1,A.a_key2,B.a_other_field1,B.a_other_field1,B...
    FROM
    (select  a_key1,.a_key2 ,max(update_time) as max_update_time
    from b 
    group by  a_key1,.a_key2 
    ) as 
    A inner join  b as B
     on B.a_key1=A.a_key1 and B.a_key2=A.a_key2 and B.update_time=A.max_update_time
    ) AS
     b on b.a_key1=a.a_key1 and b.a_key2=a.a_key2
      

  4.   

    select a.a_key1 ,a.a_key2 ,case when b.a_other_field1  is null then a.a_other_field1  else b.a_other_field1  end as 字段1, ...
    --其他字段用同樣方法處理
    from a left join
     --根據導出的表再關聯本表,找到最後更改的記錄的其他字段
    (SELECT A.a_key1,A.a_key2,B.a_other_field1,B.a_other_field1,B...  
    FROM
    --提取最後更改的記錄(因為最後更改的時間+主鍵 是唯一的)
    (select  a_key1,.a_key2 ,max(update_time) as max_update_time 
    from b 
    group by  a_key1,.a_key2 
    ) as 
    A inner join  b as B
     on B.a_key1=A.a_key1 and B.a_key2=A.a_key2 and B.update_time=A.max_update_time
    ) AS
     b on b.a_key1=a.a_key1 and b.a_key2=a.a_key2
      

  5.   

    以上代碼多了點號:
                    --提取最後更改的記錄(因為最後更改的時間+主鍵 是唯一的)
    (select  a_key1,a_key2 ,max(update_time) as max_update_time 
    from b 
    group by  a_key1,a_key2 
    ) as 時間字段若是字符型就用以上方法處理,若是日期型就用datediff函數比較:select datediff(ss,時間1,時間2)=0   --等於0表相等,精確到秒
    select datediff(dd,時間1,時間2)=0   --等於0表相等,精確到天
    祥細可見幫助
      

  6.   

    select a_key1,a_key2
    ,a_other_field1=isnull(b.a_other_field1,a.a_other_field1)
    ,a_other_field2=isnull(b.a_other_field2,a.a_other_field2)
    ,....
    from a表 a left join(
    select a.* from b表 a join(
    select b_key=min(b_key) from b表 aa join(
    select a_key1,a_key2,update_time=max(update_time)
    from b表 group by a_key1,a_key2
    )bb on aa.a_key1=bb.a_key1 and aa.a_key2=bb.a_key2 
    and aa.update_time=bb.update_time
    )b on a.b_key=b.b_key
    )b on a.a_key1=b.a_key1 and a.a_key2=b.a_key2
      

  7.   


    select a_key1,a_key2
    ,a_other_field1=isnull(b.a_other_field1,a.a_other_field1)
    ,a_other_field2=isnull(b.a_other_field2,a.a_other_field2)
    ,....
    from a表 a left join(
    select a.* from b表 a join(
    select b_key=min(b_key) from b表 aa join(
    select a_key1,a_key2,update_time=max(update_time)
    from b表 group by a_key1,a_key2
    )bb on aa.a_key1=bb.a_key1 and aa.a_key2=bb.a_key2 
    and aa.update_time=bb.update_time
    )b on a.b_key=b.b_key
    )b on a.a_key1=b.a_key1 and a.a_key2=b.a_key2
      

  8.   

    上面的处理语句,考虑了同一组 a_key1,a_key2
    update_time可能相同的情况,此时取主键最小的那条记录: min(b_key)
    如果是取b_key最大的记录,相应的函数修改为max即可
      

  9.   

    偶是新手,还看不懂,学习ing……
      

  10.   

    谢谢各位,问题我已经解决了,因为我用的是MYSQL,本来这帖子应该发在MYSQL部分去的,那天死活出错,想想也就发在这里了,可能我的MYSQL 版本低,不支持select作为新表来用,所以列位的东东没用,但借鉴了各位的实现思想,并且还找到了替换in select的方法,拿出来与大家共享,“select * from product where prodId not in (select catProdId from categoryMember)”不支持的话,可尝试“select product.* from product LEFT JOIN categoryMember ON product.prodID=categoryMember.catProdID WHERE categoryMember.catProdID IS NULL”,这两者经测验是等价的。