【问题标题】:How to query a postgresql table twice in a single SQL statement如何在单个 SQL 语句中两次查询 postgresql 表
【发布时间】:2017-09-07 00:32:13
【问题描述】:

我有两张桌子。

af_fiberphase是非洲光纤网络项目列表,包含以下关键领域:

  • the_geom
  • operator_id
  • owner_id

af_organisation 是一个表格,提供有关 af_fiberphase 中引用的组织的更详细信息。我为运营商和所有者组织使用了一个表,因为它们有时是相同的,有时不是。 af_organisation 的关键字段是:

  • organisation_id
  • 名称
  • web_url

我想做一个查询,从 af_fiberphase 提取项目并从组织表中填充有关所有者和操作员的详细信息。查看示例,看起来像下面这样的东西应该可以工作,但它会产生一个连接错误。

SELECT af_fibrephase.* 
FROM af_fibrephase AS fibre
INNER JOIN af_organisation AS org1 on fibre.operator_id = org1.organisation_id
INNER JOIN af_organisation AS org2 on fibre.owner_id = org2.organisation_id

可以在af_fibrephaseaf_organisationhttps://carto.com 上找到实际表格

【问题讨论】:

  • 它会产生错误,因为您在定义别名后使用表名..in select.
  • 在两者上都使用 LEFT JOIN 而不是 INNER JOIN。然后在您的 SELECT 中,引用您需要的 org1 和 org2 列。
  • 谢谢ShawnJuergen。现在我真正理解了内连接和左连接之间的区别,而且左外连接和左外连接是一回事。

标签: sql postgresql join cartodb


【解决方案1】:

见上面的评论。使用来自 af_organisation 的 LEFT OUTER JOIN 和别名所需字段。

SELECT fibre.*
    , org1.name AS operator_name
    , org1.web_url AS operator_web_url
    , org1.<etc> AS operator_<etc>
    , org2.name AS owner_name
    , org2.web_url AS owner_web_url
    , org2.<etc> AS owner_<etc>
FROM af_fibrephase AS fibre
LEFT OUTER JOIN af_organisation org1 on fibre.operator_id = org1.organisation_id
LEFT OUTER JOIN af_organisation org2 on fibre.owner_id = org2.organisation_id

【讨论】:

  • 注意:如果您的 fiberphase 没有所有者或操作员,则会显示 NULL 代替它们。如果你想消除那些没有所有者和操作符的,你可以回到 INNER JOINs。
【解决方案2】:
SELECT fibre.*, 
       org1.name as org1_name,
       org2.name as org2_name
FROM af_fibrephase AS fibre
LEFT JOIN af_organisation AS org1 on fibre.operator_id = org1.organisation_id
LEFT JOIN af_organisation AS org2 on fibre.owner_id = org2.organisation_id

【讨论】:

    猜你喜欢
    • 2014-01-07
    • 2021-05-09
    • 1970-01-01
    • 2021-03-17
    • 2018-02-12
    • 1970-01-01
    • 2015-11-05
    • 2016-11-03
    • 2023-03-21
    相关资源
    最近更新 更多