【问题标题】:PostgreSQL join two tables without multiplying columnsPostgreSQL连接两个表而不增加列
【发布时间】:2018-02-28 00:55:32
【问题描述】:

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

-----------------------------------------------
|   gid   |  geom   |  ogc_fid   | nuts |.... |
|    1    |  ...    |    ...     | ...  |.... |
|    2    |  ...    |    ...     | ...  |.... |
|    3    |  ...    |    ...     | ...  |.... |
|    4    |  ...    |    ...     | ...  |.... |

我想与其他表,有更多的列加入,但很多都是一样的第一个,所以它看起来是这样的: P>

 _________________________________________________________
|   gid   |  geom   |  ogc_fid   | nuts |  x  |  y  |  z  |
|    1    |  ...    |    ...     | ...  |.... |  .  |  .  |
|    2    |  ...    |    ...     | ...  |.... |  .  |  .  |
|    3    |  ...    |    ...     | ...  |.... |  .  |  .  |
|    4    |  ...    |    ...     | ...  |.... |  .  |  .  |

加入后,它假设看起来一样的第二一个表。但与第一个和第二个的所有记录。 P>

我尝试过这样做:

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

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

【问题讨论】:

    标签: mysql postgresql join


    【解决方案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】:

      如果您想避免选择两个表之间的同一列,请不要使用** 是所有列的别名),而是在选择中使用显式列名,例如:

      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;
      

      【讨论】:

        【解决方案3】:

        您可以使用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.geomx.gid = y.gid = 1 不同,您将在结果中得到两行,一行包含来自x 的值,另一行包含来自y 的值。因此,仅当您知道共享列将具有任何给定 gid 的匹配值时,才应使用此方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-03
          相关资源
          最近更新 更多