1

我想知道“左外连接”和“全部联合”之间最好和最快的解决方案是什么。数据库是 PostgreSQL。

使用 UNION ALL 查询:

SELECT * FROM element, user WHERE elm_usr_id = usr_id
UNION ALL
SELECT * FROM element WHERE elm_usr_id ISNULL;

使用 LEFT OUTER JOIN 查询:

SELECT * FROM element LEFT OUTER JOIN user ON elm_usr_id = usr_id;
4

3 回答 3

3

您的两个查询可能不会产生相同的结果。

您使用 UNION ALL 的查询会返回匹配的行以及由于 中的空值而不匹配的行elm_usr_id

而使用 LEFT JOIN(与 LEFT OUTER JOIN 相同)的查询返回匹配的行以及由于任何不对应的值而不匹配的行。

关于这一点,如果您希望看到所有行,使用 LEFT JOIN 的查询会更安全。

回到您最初的问题,使用 LEFT JOIN 的查询是利用索引的最佳选择。例如,如果您想要一个排序的结果,那么 UNION 查询将是最慢的。或者,如果您的查询是主查询中的子查询,那么 UNION 将阻止对表 [元素] 索引的任何可能利用。因此,执行此类子查询的 JOIN 或 WHERE 会很慢。

于 2012-09-14T09:03:54.707 回答
1

在这种特殊情况下,我建议 LEFT OUTER JOIN 超过 union all,

就像在联合中一样,您必须阅读表格两次,而在 LEFT OUTER JOIN 中只需阅读一次

于 2012-09-14T08:50:06.873 回答
1

可能是 LEFT JOIN,但您可以通过运行来查看查询计划EXPLAIN ANALYSE SELECT...。如果您根据 elm_usr_id 的空值来修改列,则 UNION ALL 表单可能会更清晰,但您始终可以使用CASELEFT JOIN 来进行列修改。

于 2012-09-14T08:51:10.533 回答