我想从多个表中检索id
的完整列表,它们可以完全重叠或相互排斥。我想知道哪个会有更好的性能,哪个是PostgreSQL的正确途径,为什么会这样呢?PostgreSQL:选择不同的ID联合与选择ID完全联接
说我有4个表,和表索引为优化:
[SELECT DISTINCT ... UNION]
SELECT DISTINCT id from table1
UNION
SELECT DISTINCT id from table2
UNION
SELECT DISTINCT id from table3
UNION
SELECT DISTINCT id from table4
;
[SELECT ... FULL JOIN]
SELECT DISTINCT coalesce(a.id, b.id, c.id, d.id) AS id
FROM table1 a
FULL JOIN table2 b on a.id=b.id
FULL JOIN table3 c on b.id=c.id
FULL JOIN table4 d on c.id=d.id
;
这里做了一些调整。感谢@ Hogan在他的回答中的建议。
注意
我对full join
整个动机是因为id
字段可以表之间的完全重叠。 full join
可能会缓解一些表扫描。
这些不一样 – Hogan
没有必要用'UNION'区分。 'UNION'返回不同的值。 'UNION ALL'返回所有值 – lad2025
@ lad2025。 。 。没有必要,但是在某些情况下,它可以产生更好的执行计划(即,当索引可以用于子查询中的“distinct”)时。也就是说,这两个查询是不相同的,所以我怀疑OP是否知道这个细微差别。 –