来自2个相同表

时间:2017-09-15 15:35:59

标签: postgresql

我有两个不同的表(从多个源中提取以获取这些视图)具有完全相同的列名,我试图从表A中找到值,这与表B不同。

表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。类似地,对于Row id = 15,除了survey_date之外,每个列都匹配,因此除了survey_date之外,结果应该使所有列值为null,我该如何实现?对不起,如果它已经发布

1 个答案:

答案 0 :(得分:0)

您需要做的是分别比较每个字段和#34;案例中的代码"当表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)