使用 OR 连接多列

Esp*_*nta 4 join sql-server

我有一个 100 万条记录的表来加入另一个有 100000 条记录的表。但是,表 1 中有 5 个潜在的键(假设帐号、电子邮件地址、会员编号、备用电子邮件和 ID 号)和表 2 中的 60 列 () 必须用作连接键。所以,我的代码如下所示:

Select * FROM tbl1 t1 join tbl2 t2 on
t1.col1 = t2.col1 OR 
t1.col1 = t2.col2 OR
t1.col1 = t2.col3 OR
...
t1.col5 = t2.col1 
Run Code Online (Sandbox Code Playgroud)

等等。5 和 60 的组合是巨大的,它会杀死服务器。这听起来也不合逻辑。我正在考虑将 60 列作为行并增加记录数以减少列数。但是,尚不确定这是否是最佳解决方案。任何不杀死服务器的解决方案都受到高度赞赏。

注意:请注意,tb1 中的每一列都将与 tbl2 中的 10-15 列进行匹配。例如,col1包含“帐号”的列与包含col1-10所有潜在“帐号”的列相连。col1绝不会加入电子邮件地址或其他一些列。

Len*_*art 8

我不认为有办法让这个查询执行得很好,但如果你使用IN谓词,代码会更容易阅读:

select * 
from tbl1 t1 
join tbl2 t2 
    on t1.col1 in (t2.col1, t2.col2, ...) 
    or ...
    or t1.col5 in (t2.col1, ... )
Run Code Online (Sandbox Code Playgroud)


小智 6

虽然我认为您应该考虑更改设置,但您可以尝试使用 UNION 方法。

您可以针对每个案例进行特定查询,然后将它们联合在一起,而不是进行多个 OR 连接。然后你就有机会让每个单独的查询使用索引。

所以像

Select * FROM tbl1 t1 join tbl2 t2 on
t1.col1 = t2.col1 

UNION 

Select * FROM tbl1 t1 join tbl2 t2 on
t1.col1 = t2.col2

.....

UNION 

Select * FROM tbl1 t1 join tbl2 t2 on
t1.col5 = t2.col1
Run Code Online (Sandbox Code Playgroud)

等等……

这样做,我也会考虑只从表中选择键而不是 *; 并进入一个临时结构。从中选择键并连接并选择您的数据,因此您可以最小化联合查询的每个单独索引的大小。

(但是 - 在我看来,你应该认真考虑改变结构)