Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL联合两个表并与第三个表联接_Sql_Postgresql_Join_Query Optimization_Union - Fatal编程技术网

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

PostgreSQL联合两个表并与第三个表联接,sql,postgresql,join,query-optimization,union,Sql,Postgresql,Join,Query Optimization,Union,我想合并到表并使用第三个元数据表将它们连接起来,我想知道哪种方法最好/最快? 数据库是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.date

我想合并到表并使用第三个元数据表将它们连接起来,我想知道哪种方法最好/最快?
数据库是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
或者先进行联合,然后进行联接:

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

在这两条语句上运行一个,然后您将看到哪一条更有效。

由于sql引擎优化程序的缘故,它可能是不可预测的。最好看看执行计划。最后,这两种方法可以用相同的方式表示

据我所知,运行Explain将揭示PostgreSQL将第二种解释为第一种,前提是不存在
group by
子句(显式或隐式是由于
union
而不是
union all
)在任何子查询中。

我发现第二个在(人眼)上更容易。我通常选择最“合理”的方法或最容易阅读和维护的方法(通常是同一件事,这不仅仅是巧合),除非它对另一个候选构造的性能非常差。第一种方法对我来说是获取数据的有效方法。然后如何将其插入
表2
?我在选择之前添加了一个
插入(列)
,并且能够添加行