假如我有表任务表Task里面有supplierName字段,现在我要查询供应商表里面的供应商,加入供应商里面是126.com,sina.com,163.com,qq.com,sohu.com,yahoo.com.cn,如果我task里面的supplierName里面的供应商在供应商表里面没有126.com,sina.com,163.com,qq.com,sohu.com,yahoo.com.cn这些那么我就全部改成qq.com,这个用sql怎么做?update 
emails_1442 tm set tm.category = 'unknown.smtp.com.cn'
 where lower(trim(nvl(nvl tm.category,'unknown.smtp.com.cn'))) 
 not in (select tc.mail_category_name from EM_MAIL_CATEGORY tc); 这样为什么没用了?

解决方案 »

  1.   

    --应该可以这么写,
    --数据库是大小写兼容的,select sysdate ,SYSDATE from dual得到的结果一致
    update emails_1442 tm
       set tm.category = 'unknown.smtp.com.cn'
     where not exists (select 1 from EM_MAIL_CATEGORY tc);
      

  2.   


    update emails_1442 tm
    set tm.category = 'unknown.smtp.com.cn'
    where not exists (select 1 from EM_MAIL_CATEGORY tc where tc.mail_category_name = tm.category);
      

  3.   

    我觉得应该是这样的:UPDATE emails_1442 tm SET tm.category = 'unknown.smtp.com.cn'
    WHERE to_lower(tm.category) NOT IN 
    (SELECT to_lower(tc.mail_category_name) FROM EM_MAIL_CATEGORY tc);
      

  4.   


    可以直接用to_lower?为什么报to_lower无效?
      

  5.   

    更新后的category字段里面全部是unknown.smtp.com.cn,
      

  6.   

    to_lower(tc.mail_category_name)-> lower(tc.mail_category_name)
      

  7.   

    写错了,呵呵。UPDATE emails_1442 tm SET tm.category = 'unknown.smtp.com.cn'
    WHERE LOWER(tm.category) NOT IN 
    (SELECT LOWER(tc.mail_category_name) FROM EM_MAIL_CATEGORY tc);
      

  8.   

    类似于此,当然如果是字符串的话,需要注意大小写update  emp4  e set e.deptno = 0 where not exists (select 1 from dept d where e.deptno = d.deptno)