使用左联接或联合在值之间进行选择

时间:2018-08-15 17:18:39

标签: sql

我有一个表 A ,其中的列为 ABK ACK 。每行可以在 ABK ACK 中具有一个值,但不能同时具有两者中的一个值 ABK ACK 是分别用于从表 B C 中获取更详细信息的键 B 具有名为 BK (键)的列,而 B1 C 具有名为 CK 的列>(键)和 C1 B C 获取信息时,我想根据A中的哪一列在 B1 C1 之间进行选择( ABK ACK )为 考虑到可读性和性能会更好:

1

select COALESCE(B.B1, C.C1) as X from A 
left join B on A.ABK = B.BK
left join C on A.ACK = C.CK

OR

2

select B.B1 as X from A join B on A.ABK = B.BK
UNION
select C.C1 as X from A join C on A.ACK = C.CK

换句话说,我应该对所有要使用的表进行左连接还是进行联合? 我猜想UNION的可读性更好,但是我不确定性能

B和C也不重叠,即B和C之间没有重复

我认为该问题的答案对我而言是正确的,因为它关注的事实是表B和C之间可能存在重复,但如上所述,B和C是互斥的

2 个答案:

答案 0 :(得分:0)

您的两个查询不一定完成相同的事情。

如果任一表中都有重复值,则使用LEFT JOIN将在结果中创建重复行,而UNION(与UNION ALL相反)会自动限制删除重复值(如果适用)。因此,在考虑性能之前,我将根据您是否有兴趣在结果中保留重复项来决定使用哪种方法。

有关更多信息,请参见此处:Performance of two left joins versus union

答案 1 :(得分:0)

首先,您可以测试数据库和数据的性能。您还可以查看执行计划。

第二,查询不相同,因为union删除重复项。

也就是说,我会使用left join的第一个版本,以提高可读性和性能。可读性显然是一个品味问题。我认为select中包含所有逻辑,这使查询的作用更加明显。

更重要的是,第一个将从表A开始,并且能够使用索引进行其他查找。没有用于删除重复项的附加阶段。我的猜测是两个联接比两个联接重复删除要快。