我想知道“左外部联接”和“全部联合”之间最好和最快的解决方案是什么。该数据库是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;
您的两个查询可能不会产生相同的结果。
使用UNION ALL的查询返回匹配的行以及由于中的空值而导致不匹配的行elm_usr_id。
elm_usr_id
使用LEFT JOIN(与LEFT OUTER JOIN相同)的查询返回匹配的行以及由于值不匹配而导致不匹配的行。
与此相关,如果希望看到所有行,则使用LEFT JOIN的查询会更安全。
回到您最初的问题,使用LEFT JOIN的查询是利用索引的最佳选择。例如,如果您想要一个排序的结果,那么UNION查询将是最慢的。或者,如果您的查询是主查询中的子查询,则UNION将阻止对表[element]索引的任何可能利用。因此,执行此类子查询的JOIN或WHERE会很慢。