1

我想尝试检测两个表之间的属性变化。这个旧答案让我参与其中,但不是我真正需要的。

鉴于以下

在此处输入图像描述

如果我跑

Select 'TABLE1-ONLY' AS SRC, T1.*

 from  (

    Select * from Table_Original as Original

    except

    Select * from Table_Updated as Updated

    ) As T1

Union All

Select 'TABLE2-ONLY' AS SRC, T2.*
 from  (
    Select * from Table_Updated as Updated
    except
    Select * from Table_Original as Original
    ) As T2

我明白了 在此处输入图像描述

其中的一个问题是,它不仅会在密钥相同时比较字段(因此在某处应该有'where Original.Key = Updated.Key'。

但我真正想要的输出是 在此处输入图像描述

理想情况下,这应该在QGIS SQL 实现中工作,但也对 MySQL 开放。

上面的所有数据都在https://drive.google.com/drive/folders/1y8EtdCZbNBz9JdvjLGU1N-rN-rK4p8R5?usp=sharing - 我添加了屏幕截图,因为这样输出看起来更好。

4

1 回答 1

1

您希望在结果中进行逐列比较,因此您必须将表拆分为行,其中每行是键和列的值,然后将它们与 UNION ALL 组合。
最后你加入结果:

with 
  cte1 as (
    select key, 'name' col, name val from Table_Original union all 
    select key, 'state', state from Table_Original union all 
    select key, 'water', water from Table_Original
  ),
  cte2 as (
    select key, 'name' col, name val from Table_Updated union all 
    select key, 'state', state from Table_Updated union all 
    select key, 'water', water from Table_Updated
  )  
select row_number() over (order by c1.key, c1.col) id,
       c1.key,
       c1.col [Change Field],
       c1.val [Orig Value],
       c2.val [Updated Value] 
from cte1 c1 inner join cte2 c2
on c2.key = c1.key and c2.col = c1.col and c2.val <> c1.val  
order by c1.key, c1.col  

请参阅演示
结果:

| id  | key | Change Field | Orig Value  | Updated Value |
| --- | --- | ------------ | ----------- | ------------- |
| 1   | 2   | name         | Ray Charles | Ray Tim       |
| 2   | 3   | state        | WA          | SA            |
| 3   | 3   | water        | N           | Y             |
| 4   | 4   | water        | Y           | N             |
于 2020-08-17T08:28:08.133 回答