2015-09-04 39 views
0

我有2個表TblATblBTblA的列有A B C ...ZTblB也有A B C D...Z列。我想要列的名稱,其中TblATblB數據因特定行而異。假設column Aprimary key並且永不改變,即,可以在column A上執行join在2個相似的表中比較2行並只返回不同值的列名

+0

但是,爲什麼你有兩張具有相同佈局和幾乎相同數據的表? – jarlh

+0

,因爲一個表存儲更新的數據,另一個表存儲其先前的值。 – Ankita

+0

列數真的很高(20+)嗎?你可以發佈結果應該是什麼樣子?你真的只想要列名嗎? –

回答

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=anything is null (不是真或假),所以你可能需要包裝ifnull()中的每一列來比較

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 
+0

Mysql不支持WITH。 – AdrianBR

相關問題