我想加入两个表,其中有很多列。 它看起来像这样:
-----------------------------------------------
| gid | geom | ogc_fid | nuts |.... |
| 1 | ... | ... | ... |.... |
| 2 | ... | ... | ... |.... |
| 3 | ... | ... | ... |.... |
| 4 | ... | ... | ... |.... |
我想加入其他表,它有更多列,但其中许多与第一个相同,所以它看起来像这样:
_________________________________________________________
| gid | geom | ogc_fid | nuts | x | y | z |
| 1 | ... | ... | ... |.... | . | . |
| 2 | ... | ... | ... |.... | . | . |
| 3 | ... | ... | ... |.... | . | . |
| 4 | ... | ... | ... |.... | . | . |
加入后,它看起来与第二个表看起来相同。但是有了第一个和第二个的所有记录。
我试着这样做:
select *from "migration"."X" as tab1
full outer join "migration"."Y" as tab2 on tab1.gid = tab2.gid;
但我的结果是:
-------------------------------------------------------------------------------------------------------
| gid | geom | ogc_fid | nuts |.... | gid | geom | ogc_fid | nuts | x | y | z |
| 1 | ... | ... | ... |.... | 1 | ... | ... | ... |.... | . | . |
| 2 | ... | ... | ... |.... | 2 | ... | ... | ... |.... | . | . |
| 3 | ... | ... | ... |.... | 3 | ... | ... | ... |.... | . | . |
| 4 | ... | ... | ... |.... | 4 | ... | ... | ... |.... | . | . |
我尝试了很多不同的查询,但没有得到我想要的结果。有人可以帮帮我吗?
答案 0 :(得分:2)
您可以使用NATURAL
确保只列出一次具有相同名称的列:
SELECT * FROM "migration"."X" NATURAL FULL OUTER JOIN "migration"."Y";
引用The FROM Clause的PostgreSQL文档:
NATURAL是USING的简写形式:它形成一个USING列表,其中包含出现在两个输入表中的所有列名。与USING一样,这些列在输出表中只出现一次。如果没有公共列名,NATURAL JOIN的行为类似于JOIN ... ON TRUE,产生跨产品连接。
请注意,如果某些行的值与名称相同的列不匹配,NATURAL FULL OUTER JOIN
会在结果中多次显示这些值。例如,如果x.geom
与y.geom
的{{1}}不同,则结果中会有两行,一行的值为x.gid = y.gid = 1
,另一行的值为x
1}}。因此,如果您知道共享列将具有任何给定y
的匹配值,则应该仅使用此方法。
答案 1 :(得分:1)
尝试以下查询:
select tab1.*, tab2.x,tab2.y,tab2.z from "migration"."X" as tab1
full outer join "migration"."Y" as tab2 on tab1.gid = tab2.gid;
希望得到这个帮助。
答案 2 :(得分:0)
如果要避免在两个表之间选择相同的列,请不要使用*
(*
是所有列的别名)但是在select中使用explict列名称:< / p>
Select tab1.gid, tab1.geom, tab1.ogc_fid ,tab1.nuts, tab2.geom, tab2.ogc_fid
from "migration"."X" as tab1
full outer join "migration"."Y" as tab2 on tab1.gid = tab2.gid;