我想知道“左外连接”和“全部连接”之间的最佳和最快解决方案是什么。 该数据库是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;
答案 0 :(得分:1)
我建议在这个特定情况下,LEFT OUTER JOIN over union all,
就像在联合中所有你必须阅读两次表,而在LEFT OUTER JOIN中只需要一次
答案 1 :(得分:1)
可能是LEFT JOIN,但您可以通过运行EXPLAIN ANALYSE SELECT...
来查看查询计划。如果您根据elm_usr_id的null-ress修改列,则UNION ALL表单可能会更清晰,但您始终可以使用CASE
通过LEFT JOIN进行列修改。
答案 2 :(得分:1)
您的两个查询可能不会产生相同的结果。
使用UNION ALL的查询返回匹配的行以及由于elm_usr_id
中的空值而不匹配的行。
使用LEFT JOIN的查询(与LEFT OUTER JOIN相同)返回匹配的行以及由于任何不对应的值而不匹配的行。
对此,如果您希望查看所有行,则使用LEFT JOIN的查询会更安全。
回到原来的问题,使用LEFT JOIN的查询是利用索引的最佳选择。例如,如果您想要排序结果,那么UNION查询将是最慢的。或者,如果您的查询是主查询中的子查询,则UNION将阻止对表[element]索引的任何可能利用。因此,执行此类子查询的JOIN或WHERE将会很慢。