比较2个相似表中的2行,并仅返回具有不同值的列名

时间:2015-09-04 12:41:38

标签: mysql sql database join

我有2个表TblATblBTblAA B C ...ZTblB列也有A B C D...Z列。我希望列中的某个行的TblATblB数据不同。假设column Aprimary key,并且永远不会更改,即可以join执行column A

2 个答案:

答案 0 :(得分:3)

可悲的是,在将版本/默认/历史记录表与另一个表进行比较时,没有比逐列更好的方法来进行查询

select 
case when a.B!=b.B then 'B' else null end,
case when a.C!=b.C then 'C' else null end,
....(repeat for each column)

from tbla a
left join tblb b
on a.A=b.A

请记住,如果列可以包含null,null=anything is null(不是true或false),那么您可能需要将ifnull()中的每一列包装起来进行比较

答案 1 :(得分:0)

编辑:我这里没有处理空值。您可以使用数据库的函数来处理这些函数。

这是3列的示例查询。您可以将其扩展到其他列。

          with s1 (A    ,B  ,C) as
          (select 1,22,23 from dual union
           select  2,45,47 from dual union
           select  3,66,    68 from dual
          ),
          t1 (A ,B  ,C) as
          (select 1,23,24 from dual union
           select  2,45,47 from dual union
           select  3,66,    69 from dual
          ),
          chng as(
          select s1.*, case when s1.B = t1.B then '' else 'B'  end as B1 , case when s1.C = t1.C then '' else 'C'  end as C1
          from s1 ,t1
          where s1.A = t1.A
          )
           ,chkChange as(
          select a, (B1||C1) as Changes from chng
          )
          select * from chkChange
          where changes is not null