我有一个表 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是互斥的
答案 0 :(得分:0)
您的两个查询不一定完成相同的事情。
如果任一表中都有重复值,则使用LEFT JOIN将在结果中创建重复行,而UNION(与UNION ALL相反)会自动限制删除重复值(如果适用)。因此,在考虑性能之前,我将根据您是否有兴趣在结果中保留重复项来决定使用哪种方法。
有关更多信息,请参见此处:Performance of two left joins versus union。
答案 1 :(得分:0)
首先,您可以测试数据库和数据的性能。您还可以查看执行计划。
第二,查询不相同,因为union
删除重复项。
也就是说,我会使用left join
的第一个版本,以提高可读性和性能。可读性显然是一个品味问题。我认为select
中包含所有逻辑,这使查询的作用更加明显。
更重要的是,第一个将从表A
开始,并且能够使用索引进行其他查找。没有用于删除重复项的附加阶段。我的猜测是两个联接比两个联接和重复删除要快。