使用公共列POSTGRESQL在两个表之间映射不同的值
我有两张桌子使用公共列POSTGRESQL在两个表之间映射不同的值,sql,postgresql,distinct,Sql,Postgresql,Distinct,我有两张桌子 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
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
上表中的每个表都有大约30K的数据记录
需要使用zipcode作为公共键将表B记录映射到表A
这样,表B中的每个记录在表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
代码
错误
错误:对表A的FROM子句项的引用无效
第1行:R JOIN从^TableA.id上的表A中选择不同的id
提示:表A有一个条目,但不能从查询的这一部分引用它
试试下面的代码。应该有用。。。 在a.id上选择distinct* 从表a a.zipcode=b.zipcode上的左联接表b a.id订购
看起来您想要对齐表格。也就是说,匹配的键是邮政编码,它们在每个表中都是重复的。您希望将它们1-1匹配,但没有第二个键 解决方案是使用row_number创建第二个键,然后将其用于完全联接:
不是每张桌子上的id都是唯一的吗?我是新手。如果我在提出或评论war查询时犯了任何错误,请随时告诉我。首先尝试分解您的查询,并尝试说服自己它正在做您期望它做的事情。就我个人而言,我不认为你想做的事情可以用简单的方式来完成,你的查询在太多层面上都是错误的,我们无法提供任何我们可以真正合作的东西。谢谢你的反馈。。我已经修改了来自SQL pro和Zakir Hossain的查询基础输入。。当我仍然得到映射的重复值时,错误被删除..如果B中有一条记录的邮政编码在a中不存在,您想在结果集中看到它吗?嘿,感谢您的输入…但是输出文件没有从表B中获得不同的记录。。有什么建议吗?
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;
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;