内部联接的ON-子句中的附加“或准则”

|| 当“ 0”取决于两列中的任何一列时,正确的方法是(内部)联接两个表?因此,当两列中的任一列等于Table2的一列时,Table1应该联接。 查看以下简化的T-SQL,了解我的意思以及是否以正确的方式完成操作:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
GO
BEGIN TRANSACTION;
GO
create table #RMA1(
    SSN_IN varchar(15),
    SSN_OUT varchar(15)
)
create table #RMA2(
    SSN_NUMBER varchar(15),
)
INSERT INTO #RMA1 VALUES(\'012590001827977\', \'351600035840752\');
INSERT INTO #RMA1 VALUES(\'332653577440220\', \'351600035804105\');
INSERT INTO #RMA1 VALUES(\'350302031074780\', \'350302031074780\');
INSERT INTO #RMA1 VALUES(\'351649036778024\', \'351806033440194\');

INSERT INTO #RMA2 VALUES(\'012590001827977\');
INSERT INTO #RMA2 VALUES(\'332653577440220\');
INSERT INTO #RMA2 VALUES(\'350302031074780\');
INSERT INTO #RMA2 VALUES(\'351649036778024\');
INSERT INTO #RMA2 VALUES(\'351600035840752\');
INSERT INTO #RMA2 VALUES(\'351600035804106\');

SELECT SSN_IN,SSN_OUT,SSN_NUMBER FROM #RMA1 INNER JOIN
#RMA2 ON (#RMA1.SSN_IN = #RMA2.SSN_NUMBER OR
          #RMA1.SSN_Out = #RMA2.SSN_NUMBER)

DROP TABLE #RMA1;
DROP TABLE #RMA2;
GO
COMMIT TRANSACTION;
GO
结果:
SSN_IN          SSN_OUT            SSN_NUMBER
012590001827977 351600035840752    012590001827977
012590001827977 351600035840752    351600035840752
332653577440220 351600035804105    332653577440220
350302031074780 350302031074780    350302031074780
351649036778024 351806033440194    351649036778024
问:那么在内部联接的
ON
-中用ѭ3联接表是正确的吗? 它确实会正确返回5条记录并删除#RM2的最后一条记录,因为它不在
#RM1.SSN_IN
#RM1.SSN_OUT
中。但是我很难过,因为这并不总是能给出正确的结果。实际上,真正完整的查询的性能非常差。     
已邀请:
        结果应该是正确的,但是您的观察表明性能很差是正确的。数据库无法有效地使用索引,因为它必须扫描索引并对每个项目进行算术运算。 相反,进行两个左联接将使数据库更好地利用索引:
select
  SSN_IN,
  SSN_OUT,
  coalesce(T1.SSN_NUMBER, T2.SSN_NUMBER) as SSN_NUMBER
from
  #RMA1
  left join #RMA2 as T1 on #RMA1.SSN_IN = T1.SSN_NUMBER
  left join #RMA2 as T2 on #RMA1.SSN_Out = T2.SSN_NUMBER
where
  T1.SSN_NUMBER is not null or T2.SSN_NUMBER is not null
    

要回复问题请先登录注册