通过多列连接并避免 SQL 中的 OR 的最佳方法
Posted
技术标签:
【中文标题】通过多列连接并避免 SQL 中的 OR 的最佳方法【英文标题】:best way to join by multiple columns and avoid OR in SQL 【发布时间】:2021-03-26 12:50:43 【问题描述】:我需要推荐。
我有两张桌子。表 1 是主表,表 2 是我最初认为通过左连接加入表 1 的表,表 2 比表 1 大得多。加入表 1 和表 2 的最佳执行方式是b 列等于 b 列或 c 列等于 c 列且 d 列等于 d 列的联合条件,即满足这些条件中的任何一个但不满足空值。这在左连接中没有使用 OR,因为它会具有较差的性能和执行时间。感谢您的帮助。
注意:表1和表2是40行查询的结果。数据库不支持递归查询。数据库是 sap hana。
表 1
ID | column b | column c | column d |
---|---|---|---|
1 | d | g | j |
2 | e | h | k |
3 | f | i |
表 2
ID_2 | column b | column c | column d |
---|---|---|---|
4 | d | g | |
5 | k | ||
6 | i |
想要的结果
ID | column b | column c | column d | ID_2 |
---|---|---|---|---|
1 | d | g | J | 4 |
2 | e | h | k | 5 |
3 | f | i | 6 |
【问题讨论】:
用您正在使用的数据库标记您的问题。 【参考方案1】:使用两个left join
s:
select t1.*,
coalesce(t2_b.id_2, t2_c.id_2, t2_d.id_2) as id_2
from table1 t1 left join
table2 t2_b
on t1.b = t2_b.b left join
table2 t2_c
on t1.c = t2_d.c and t2_b.b is null
table2 t2_d
on t1.d = t2_d.d and t2_c.c is null;
请注意,为了获得最佳性能,您需要三个索引:
table2(b, id_2)
table2(c, id_2)
table2(d, id_2)
【讨论】:
您好,有没有什么方法可以做到这一点,而不必多次编写查询并避免使用'with',因为数据库不支持使用递归查询。表 2 和表 1 来自一个已经很繁重的查询。 @RevanKnight 。 . .使用 CTE 定义值。问题是关于tables。您可能想问另一个更能描述您的实际问题的问题。 你确实不想要HANA上的多列索引以上是关于通过多列连接并避免 SQL 中的 OR 的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章