使用公共列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;