两个表是一摸一样的,只有在不同的服务器数据库中,现在两边数据库不同步,需要查询出数据库之间的差异进行同步,表里有十几个字段,但是没有一个字段有唯一约束。重要的字段(重复几率小的,可作为查询条件),合同编号、合同金额,签订日期。我做的时候是根据合同编号来做的,功能我已经实现,但是很麻烦,我是一步一条SQL语句查询,还有用Ctrl+F去检查。
  业务需求:查询两个表之间的差异,如:A-1表中没有的数据但是A-2中有,A-2中有的数据但A-1中没有。
  难点:1、两个表都有的相同记录,但是记录数不同。
        2、差异必须是所有字段的数据不一样才算差异,不能多单单是某个字段。只要能让两个表的数据完全一样就行了,但是同步的事情先不做,我只要查询出双方直接差异。
求sql语句2条
1条显示A-1和A-2差异   一条显示A-2和A-1差异  因为我要做两个TABLE来显示差异结果

解决方案 »

  1.   

    LZ用的什么数据库 如果能跨库查询 用JOIN语句能否完成你想要的效果? 
      

  2.   

    两台不同的服务器不知道你是怎么做连接的?
    查询在A1表中存在,在A2表中不存在的记录:
    select * from A1 a where not exists
    (select 1 from A2 where 合同编号=a.合同编号 and 合同金额=a.合同金额 and 签订日期=a.签订日期
    .......所有不允许重复的字段)查询在A2表中存在,在A1表中不存在的记录:
    select * from A2 a where not exists
    (select 1 from A1 where 合同编号=a.合同编号 and 合同金额=a.合同金额 and 签订日期=a.签订日期
    .......所有不允许重复的字段)
      

  3.   


    我是这么查的 但是这样只能查出不存在的记录,还有一种情况是两个都有相同的记录,但是记录条数不一样,比如A-1有2条记录,A-2有5条记录,怎么样才能用一条sql查出来,我是分开查的,特别麻烦,还有手工去比对。。
      

  4.   


    不知道你什么数据库。
    记录数不同的,你这个没有主键,不是很好办。
    不过可以利用group by 所有字段,计算count(*)来找出来。比如:
    select t1.*,t2.c2 from
    (select a,b,c,d,e,f,g,count(*) c1 from A group by a,b,c,d,e,f) t1,
    (select a,b,c,d,e,f,g,count(*) c1 from B group by a,b,c,d,e,f) t2
    where t1.c1>=1 and t2.c1>=1 and t1.c1<>t2.c1 
    查出多于一条且数量不等的。
    其他的比如一边有一边没有的上面的两条语句已经找到了。sql有点烂,呵呵,试试看吧
      

  5.   

    select t1.*,count(*) as ct
    from A1 t1
    group by 合同编号,合同金额,签订日期,...A1中所有字段
    having count(*)=
    (select count(*) from A2 where 合同编号=t1.合同编号 and 合同金额=t1.合同金额 and 签订日期=t1.签订日期.......所有不允许重复的字段)