我有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
答案 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值 - >这种方法会增加你的表空间,并且 也会影响你的写入速度。如果你不那么担心 关于写性能,只关注上面的内容 性能这种方法更适合。
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 )
)