2017-09-15 58 views
0

我有两个不同的表(从多个来源提取以获得这些意见),具有完全相同的列名称,我试图从表A中找到值,这是从表B的差异。从2个相同的表列之间的sql差异

为表A样本数据:

 id  | code | dos  |  entry_id | survey_date 
------------+----------+------------+----------------+------------- 
    1  | 0120  | 2017-07-02 |  141949406 | 2017-07-04 
    2  | 0150  | 2017-07-02 |  141949394 | 2017-07-04 
    3  | 4910  | 2017-07-02 |  141949304 | 2017-07-04 
    4  | 0150  | 2017-07-02 |  141945276 | 2017-07-31 
    5  |   |   |    | 2017-07-31 
    6  | 0150  | 2017-07-02 |  141937311 | 2017-07-04 
    7  |   |   |    | 2017-07-27 
    8  | 0120  | 2017-09-01 |  142080557 | 2017-08-01 
    9  |   |   |    | 2017-07-31 
    10  |   |   |    | 2017-07-31 
    15  | 0150  | 2017-07-02 |  141933588 | 2017-07-31

为表B示例数据:

Table B: 
    id  | code | dos  |  entry_id | survey_date 
------------+----------+------------+----------------+------------- 
    11  | 0150  | 2017-09-05 |  142081004 | 
    12  | 0150  | 2017-09-05 |  142082062 | 
    1  |   |   |    | 2017-07-04 
    16  | 0120  | 2017-07-02 |  141949391 | 
    2  |   |   |    | 2017-07-04 
    3  | 4910  | 2017-07-02 |  141949304 | 2017-07-04 
    3  | 4910  | 2017-07-02 |  141949304 | 2017-07-04 
    13  | 0150  | 2017-07-02 |  141947246 | 
    4  | 0150  | 2017-07-02 |  141945276 | 2017-07-31 
    14  | 0150  | 2017-07-02 |  141943912 | 
    5  |   |   |    | 2017-07-31 
    6  |   |   |    | 2017-07-04 
    15  | 0150  | 2017-07-02 |  141933588 | 
    7  |   |   |    | 2017-07-27 
    8  |   |   |    | 2017-08-01 
    9  |   |   |    | 2017-07-31 
    10  |   |   |    | 2017-07-31

我已经使用

select * from table_A except select * from table_b; 

结果样品:

 id | code | dos  |  entry_id | survey_date 
------------+----------+------------+----------------+------------- 
    1  | 0120  | 2017-07-02 |  141949406 | 2017-07-04 
    2  | 0150  | 2017-07-02 |  141949394 | 2017-07-04 
    8  | 0120  | 2017-09-01 |  142080557 | 2017-08-01 
    6  | 0150  | 2017-07-02 |  141937311 | 2017-07-04 
    15  | 0150  | 2017-07-02 |  141933588 | 2017-07-31

它给了我不同行,但我需要的是不同的 预期结果列值:

 id | code | dos  |  entry_id | survey_date 
------------+----------+------------+----------------+------------- 
    1  | 0120  | 2017-07-02 |  141949406 | 
    2  | 0150  | 2017-07-02 |  141949394 | 
    8  | 0120  | 2017-09-01 |  142080557 | 
    6  | 0150  | 2017-07-02 |  141937311 | 
    15  |   |   |    | 2017-07-31

预期的结果集ID = 1有survey_date值,因为该值是表B的一部分,我需要它为null。同样,对于行id = 15,除了survey_date以外,每个列都匹配,因此结果应该除了survey_date之外的所有列值都为null,我该如何实现?对不起,如果它已发布较早

+1

改变为具有期望输出 – bocadev

+0

它必须是 “SELECT *” 或可能是“选择ID,密码,DOS,entry_id,survey_date描述,等等 –

+0

它可以选择ID,代码,DOS等 – bocadev

回答

0

你需要做的是比较每个领域单独和代码在一个“案件”,当他们匹配或不匹配表a和b匹配时做什么。然后,您需要整体排除整行匹配的行。下面我会做到这一点,并使用row_to_json来协助比较整个行。可能比row_to_json更有效,但这应该起作用。

select 
a.id, 
case when a.code=b.code then null 
    else b.code end code, 
case when a.dos=b.dos then null 
    else b.dos end dos, 
case when a.entry_id=b.entry_id then null 
    else b.entry_id end entry_id, 
case when a.survey_date=b.survey_date then null 
    else b.survey_date end survey_date 
from table_a a 
join table_b b on b.id=a.id 
where row_to_json(a) != row_to_json(b) 
+0

谢谢Joe,它对于给定的示例数据非常有用,我很抱歉,我没有提到Table_a id列不是主键既不是我的示例数据足够明显可以使其清楚,它也可以具有重复ids on multiple rows。加入一列在这种情况下将不够用 – bocadev

+0

这有助于你找到答案吗?主键是什么 - 你有GOT有办法链接两条记录在每个表中 - 给我,我会给你一个答案。 –

+0

这些数据提供临时t在示例中提供的“table_a”数据是通过连接其他几个表而获得的,而“table_b”数据是从json列派生的,这就是为什么我没有任何表上的主键。 – bocadev