使用公共列 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;
我有两个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;