我有两个不同的表(从多个源中提取以获取这些视图)具有完全相同的列名,我试图从表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,我该如何实现?对不起,如果它已经发布
答案 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)