通过多列连接并避免 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 joins:

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 的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

用于连接并在多列中给出结果的 SQL 语句

在 PHP 中避免代码注入的最佳方法

SQL 内连接 2 个具有多列条件的表并更新

从多列中选择最小值的最佳方法是什么?

如何在 SQL 中通过多列连接两个表?

具有多列连接的 Sql 查询