有两张表,A,B。 两张表字段完全相同,a,b,c,d四个字段。 现在要比较出a,b字段相同,但c,d字段不同的数据,显示B表的数据。c,d字段都有可能为空 

解决方案 »

  1.   


    select B.*
    from A,B
    where A.a||A.b = B.a||B.b
          and A.c||A.d||'#' != B.c||B.d||'#'?
      

  2.   

    select B.*
    from A , B
    where (A.c > B.c  or A.c<B.c)
          and (A.d > B.d  or A.d<B.d)
          and A.a = B.a
          and A.b = B.b
      

  3.   

    select   B.*
    from   A   ,   B
    where   (A.c   >   B.c     or   A.c <B.c)
                and   (A.d   >   B.d     or   A.d <B.d)
                and   A.a   =   B.a
                and   A.b   =   B.b 
      

  4.   

    同意1楼,都说了c,d字段可能为空,where   (A.c   >   B.c     or   A.c <B.c)
                and   (A.d   >   B.d     or   A.d <B.d) 明显错误
      

  5.   

    引用一下5楼的观点
    1楼的语句明显错误  
    A.a||A.b = B.a||B.b
    如果  A.a = ‘1’ A.b =‘12’ 
          B.a = ‘11’B.b =‘2’
    那么就能满足上面的条件 因为‘112’=‘112’
    这是错误的
    并且也使用不到普通索引  除非你在A表中建立一个函数索引(A.a||A.b)
    在B表中也建立个函数索引 (B.a||B.b)但是 下面
    and A.c||A.d||'#' != B.c||B.d||'#'
    的这个语句因为使用了 !=  所以还是要进行全表扫描  所以上面的索引建立和不建立没什么区别
    因为这个语句是先进行全表扫面 在进行索引扫描 效率很低and A.c||A.d||'#' != B.c||B.d||'#'  这个语句去除掉了 c d 都为空的情况
    既如果 A表的c d 和B表的 c d 对应的值都为空  那么也不提取这条数据 
    5楼的说 (A.c   >   B.c     or   A.c <B.c)
                and   (A.d   >   B.d     or   A.d <B.d)
    这个语句明显是错的  因为有为空的情况存在
    那你的意思是  A.c > '' 这个语句语法是错误的了?
    这个语句和  
    and A.c||A.d||'#' != B.c||B.d||'#'
    这个语句的筛选效果是一样的
     同意1楼,都说了c,d字段可能为空,where   (A.c   >   B.c     or   A.c  <B.c)
                 and   (A.d   >   B.d     or   A.d  <B.d) 明显错误
    [/Quote]
      

  6.   

    Quote7:
    现在不考虑索引,要你这么说,那你还的考虑 A,B表的数据量有多大,谁的更多,考虑是否使用exists。
    另外为空不是'',是null