使用公共列 PostgreSQL 在两个表之间映射不同的值

MAP DISTINCT VALUES BETWEEN TWO TABLES USING COMMON COLUMN POSTGRESQL

我有两个table

         Table A                        Table B 
id (pk) Name    zipcode         id (pk) Name    zipcode
1         A     100021          B1      T       400031
2         R     400031          B2      U       400031
3         S     100021          B3      W       100022
4         D     100021          B4      Z       100021
5         E     100021          B5      X       100021
6         F     400032          B6      O       400030
7         G     400030          B7      P       400030
8         H     100021          B8      Y       100021

上面的table每个都有大约30k条数据记录
需要将 Table B 记录映射到 table A,使用邮政编码作为公共键
这样 table B 中的每条记录只在 table A

中映射一次

期望的输出

id (pk) Name    zipcode     id (pk) Name    zipcode
1        A       100021      B4      Z     100021
2        R       400031      B1      T     400031
3        S       100021      B5      X     100021
4        D       100021      B8      Y     100021
5        E       100021     null    null    null
6        F       400032     null    null    null
7        G       400030      B6      O     400030
8        H       100021     null    null    null

代码

SELECT              
   TableA.id, TableB.id             
FROM                
   (SELECT DISTINCT id FROM TableA) TableA              
   FULL OUTER JOIN              
   (SELECT DISTINCT id FROM TableB) TableB              
              ON TableA.pincode = TableB.pincode;

错误

"ERROR : invalid reference to FROM-clause entry for table Table A

LINE 1: R JOIN (select distinct id from Table A)Table A on ^ TableA.id

HINT: There is an entry for Table A, but it cannot be referenced from this part of the query"

试试下面的代码。应该管用... select distinct on (a.id) * from TableA a left join TableB b on (a.zipcode = b.zipcode) order by a.id

您似乎想要 "align" table。也就是说,匹配键是邮政编码,并且在每个 table 中都是重复的。你想1-1匹配,但是没有第二把钥匙

解决方案是使用 row_number() 创建第二个密钥,然后将其与 full join 一起使用:

SELECT a.*, b.*            
FROM (SELECT a.*,
             ROW_NUMBER() OVER (PARTITION BY zipcode ORDER BY id) as seqnum
      FROM TableA a
     ) a FULL JOIN          
     (SELECT b.*
             ROW_NUMBER() OVER (PARTITION BY zipcode ORDER BY id) as seqnum
      FROM TableB b
     ) b              
     ON a.zipcode = b.zipcode AND a.seqnum = b.seqnum;