SQL的最佳实践JOIN如果Field1 IS为NULL,则为Field2 ELSE Field1

时间:2016-07-20 17:01:10

标签: sql sql-server sql-server-2008 sql-server-2008-r2

我有2个体面的大小表(200k +行),我正在尝试进行基本的左连接。每个表中有2个不同的ID字段可用于加入

ID1 =最好加入,但通常为NULL,字母数字,所以它是一个varchar

ID2 =总是有一个值,数字

所以我现在正在加入这样的行动,但过了10分钟左右我就取消了它:

SELECT a.*,
       b.fieldname
FROM TABLE1 a
  LEFT JOIN TABLE2 b
     ON COALESCE(a.ID1,CONVERT(Varchar(10),a.ID2)) = COALESCE(b.ID1,CONVERT(Varchar(10),b.ID2))

我基本上更喜欢JOIN ON ID1,但当ID1为NULL时,则JOIN ON ID2

有更有效的方法吗?帮助赞赏

****更新

考虑两个表中的数据是否如此:

ID2              ID1
300              NULL
301              NULL
309              NULL
311              311-A
311              311-B
314              NULL
316              316-1
316              316-3

因为你可以看到大部分时间ID1都是NULL,这很好,因为ID2是唯一的,但有时会有ID2的扩展,那就是当我想加入ID1时

所以我想要在psuedocode中实现的是这样的事情:

SELECT a.*,
    b.fieldname
FROM TABLE1 a
LEFT JOIN TABLE2 b
  ON IF a.ID1 IS NOT NULL THEN 
           a.ID1 = b.ID1
       ELSE
           a.ID2 = b.ID2
    END

2 个答案:

答案 0 :(得分:2)

尝试以下的ON条款:
ON (a.ID1 IS NOT NULL AND a.ID1=b.ID1) OR (a.ID1 IS NULL AND a.ID2=b.ID2)

答案 1 :(得分:1)

上述问题有多种解决方案...... 其中几个如下

  • 您可以开始重新设计表格结构,以便更好地获得独特性 id - >这通常是说但很难做到。

  • 在表格中创建一个计算列(让我们调用ID3), 如果它不为null,它将存储ID1值,否则存储 ID2值 - >这种方法会增加你的表空间,并且 也会影响你的写入速度。如果你不那么担心 关于写性能,只关注上面的内容 性能这种方法更适合。

  • 你也可以使用你要求查询的方法来检查ID1是否为空,它将写成如下 SELECT a.*,b.fieldname FROM TABLE1 a LEFT JOIN TABLE2 b ON ( ( a.ID1 IS NOT NULL AND a.ID1 = b.ID1 ) OR ( a.ID1 IS NULL AND a.ID2 = b.ID2 ) )