PostgreSQL 联合两个表并与第三个表连接

Posted

技术标签:

【中文标题】PostgreSQL 联合两个表并与第三个表连接【英文标题】:PostgreSQL union two tables and join with a third table 【发布时间】:2011-08-27 02:00:11 【问题描述】:

我想联合表并将它们与第三个元数据表连接起来,我想知道哪种方法最好/最快? 数据库是 PostgreSQL。 以下是我的两个建议,但也欢迎其他方法。

在两个表的并集之前进行连接:

SELECT a.id, a.feature_type, b.datetime, b.file_path
FROM table1 a, metadata b WHERE a.metadata_id = b.id
UNION ALL
SELECT a.id, a.feature_type, b.datetime, b.file_path
FROM table2 a, metadata b WHERE a.metadata_id = b.id

或者先做union,再做join:

SELECT a.id, a.feature_type, b.datetime, b.file_path
FROM
(
    SELECT id, feature_type, metadata_id FROM table1
    UNION ALL
    SELECT id, feature_type, metadata_id FROM table2
)a, metadata b
WHERE a.metadata_id = b.id

【问题讨论】:

我发现第二个在(人)眼上更容易。我通常会选择最“关系合理”的方法或最容易阅读和维护的方法(通常是同一件事,这不仅仅是巧合),除非它与另一个候选结构相比表现非常糟糕。 第一种方法适用于我获取数据。然后如何将其插入table2 我在选择之前添加了一个insert into (columns) 并且能够添加行 【参考方案1】:

在两个语句上运行EXPLAIN ANALYZE,然后你会看到哪个更有效。

【讨论】:

【参考方案2】:

由于 sql-engine 优化器,它可能是不可预测的。最好看一下执行计划。最后两种方法都可以用相同的方式表示

【讨论】:

【参考方案3】:

据我所知,运行 Explain 将显示 PostgreSQL 将第二个解释为第一个union all) 在任何子查询中。

【讨论】:

以上是关于PostgreSQL 联合两个表并与第三个表连接的主要内容,如果未能解决你的问题,请参考以下文章

Postgres - 连接三个表并在查询中对数据使用聚合函数

将源自不同表的两个 postgresql tsvector 字段连接到单个 postgresql 视图中,以启用联合全文搜索

在不同的列上使用 LINQ 连接三个表并在最后打印总和 [重复]

如何连接两个表并显示源?

SQL 连接两个表并检查两个表中的每个值是不是存在

如何使用枢轴连接两个表并在一个表中组合两个字段