2016-10-05 20 views
0

的错过匹配列我有2个表;第一个包含原始值和第二个表的表包含修改后的值。修改可能只发生在几列中。如何比较不同表中的两行并返回来自表

查询输出应该只包含发生更改的列(字段)。从用户界面我一次只能传递1个绘图代码(PK)。

表1

Plot code| address| Owner Name| Date of pass| Status 
========================================================== 
     |   |   |    | 
1  | aaa | Abcd  | 12/02/2016 | Pending 

表2

Plot code | address| Owner Name| Date of pass| Status 
    ========================================================= 
      |   |   |    | 
    1  | aaa | efgh  | 12/02/2016 | Allotted 

输出

Ori_OwnerName |Ori_Status| Mod_ OwnerName| Mod_Status 
=========================================================== 
Abcd   |Pending |efgh   | Allotted 
+1

“*查询输出应该只包含已发生变化列*” - 这是不可能的,因为查询需要返回相同的列数的每一行。如果两列不同的行在不同列中有所不同? –

+0

雅可能会发生。一次我应该能够解析2表中的同一行。修改可以发生在任何列中,在输出中它应该只反映那些列。 – Search

+0

再次说明:无法返回在不同行中具有不同列的结果。 –

回答

1

你不能拿到Informa公司作为不同的列,因为这对于SQL来说是不可能的:每行必须具有相同数量的列。

你可以做到这一点但使用hstore扩展(必须是installed之前,你可以用它):

select t1.plot_code, 
     hstore(t1) - hstore(t2) as original, 
     hstore(t2) - hstore(t1) as changed 
from t1 
    join t2 on t1.plot_code = t2.plot_code 
where t1 is distinct from t2; 

original包含修改后的列及其原始值。列changed包含修改的列及其新值。

为了您的例子,这会返回:

plot_code | original         | changed          
----------+-------------------------------------------+------------------------------------------- 
     1 | "owner_name"=>"Abcd", "status"=>"Pending" | "owner_name"=>"efgh", "status"=>"Allotted" 
+0

谢谢。它的工作。 – Search

相关问题