PostgreSQL连接两个表而不增加列

时间:2017-09-19 09:41:32

标签: mysql postgresql join

我想加入两个表,其中有很多列。 它看起来像这样:

-----------------------------------------------
|   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    |  ...    |    ...     | ...  |.... |  .  |  .  |

我尝试了很多不同的查询,但没有得到我想要的结果。有人可以帮帮我吗?

3 个答案:

答案 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.geomy.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;