如何比较不同表中的两行并从表

时间:2016-10-05 09:32:49

标签: postgresql

我有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 :(得分:1)

您无法将该信息作为不同的列获取,因为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"