SQL语句执行特别慢
业务如下:
从表A中取得电话字段到表B中的三个电话字段去匹配,只要表B中有一个电话匹配,即输出该条数据,如果不匹配到表C中的三个电话字段去匹配,只要有一个电话匹配,即输出该条数据
以表A中电话循环。
※电话字段不是表中的主键
源代码如下:数据一共10万条,运行超20秒, 请大家帮忙看看
——————————————————————————————
SELECT *
FROM @CustomerDt --用户自定义表类型
WHERE EXISTS (SELECT 1
FROM KH_QZKH
WHERE ISDEL = 0
AND (KH_QZKH.MOBILEPHONE1 = [联系方式1]
OR KH_QZKH.MOBILEPHONE2 = [联系方式1]
OR KH_QZKH.MOBILEPHONE3 = [联系方式1]
OR KH_QZKH.FIXPHONE1 = [联系方式1]
OR KH_QZKH.FIXPHONE2 = [联系方式1]
OR KH_QZKH.FIXPHONE3 = [联系方式1]
OR KH_QZKH.MOBILEPHONE1 = 联系方式2
OR KH_QZKH.MOBILEPHONE2 = 联系方式2
OR KH_QZKH.MOBILEPHONE3 = 联系方式2
OR KH_QZKH.FIXPHONE1 = 联系方式2
OR KH_QZKH.FIXPHONE2 = 联系方式2
OR KH_QZKH.FIXPHONE3 = 联系方式2
OR KH_QZKH.MOBILEPHONE1 = 联系方式3
OR KH_QZKH.MOBILEPHONE2 = 联系方式3
OR KH_QZKH.MOBILEPHONE3 = 联系方式3
OR KH_QZKH.FIXPHONE1 = 联系方式3
OR KH_QZKH.FIXPHONE2 = 联系方式3
OR KH_QZKH.FIXPHONE3 = 联系方式3)
OR EXISTS (SELECT 1
FROM CUSTOMER
WHERE [联系方式1(*)] = CUSTOMER.MOBILEPHONE1
OR [联系方式1(*)] = CUSTOMER.MOBILEPHONE2
OR [联系方式1(*)] = CUSTOMER.MOBILEPHONE3
OR [联系方式1(*)] = CUSTOMER.FIXPHONE1
OR [联系方式1(*)] = CUSTOMER.FIXPHONE2
OR [联系方式1(*)] = CUSTOMER.FIXPHONE3
OR 联系方式2 = CUSTOMER.MOBILEPHONE1
OR 联系方式2 = CUSTOMER.MOBILEPHONE2
OR 联系方式2 = CUSTOMER.MOBILEPHONE3
OR 联系方式2 = CUSTOMER.FIXPHONE1
OR 联系方式2 = CUSTOMER.FIXPHONE2
OR 联系方式2 = CUSTOMER.FIXPHONE3
OR 联系方式3 = CUSTOMER.MOBILEPHONE1
OR 联系方式3 = CUSTOMER.MOBILEPHONE2
OR 联系方式3 = CUSTOMER.MOBILEPHONE3
OR 联系方式3 = CUSTOMER.FIXPHONE1
OR 联系方式3 = CUSTOMER.FIXPHONE2
OR 联系方式3 = CUSTOMER.FIXPHONE3
)
------解决方案--------------------
(SELECT 1
FROM KH_QZKH
WHERE ISDEL = 0
AND ([联系方式1] in(KH_QZKH.MOBILEPHONE1,KH_QZKH.MOBILEPHONE2,KH_QZKH.MOBILEPHONE3,
KH_QZKH.FIXPHONE1,KH_QZKH.FIXPHONE2,KH_QZKH.FIXPHONE3)
....
)
改成这样的试试
------解决方案--------------------
你应该把这些不同的电话字段,放在一个临时表里
SQL code
select id,电话1 as 电话 into #tb from tb
union all
select id,电话2 from tb
union all
select id,电话3 from tb
------解决方案--------------------
SQL code
SELECT *
FROM @CustomerDt a
inner join KH_QZKH b1
on a.[联系方式1] in (b1.MOBILEPHONE1,b1.MOBILEPHONE2,b1.MOBILEPHONE3,b1.FIXPHONE1,b1.FIXPHONE2,b1.FIXPHONE3)
and b.ISDEL=0
inner join KH_QZKH b2
on a.[联系方式2] in (b2.MOBILEPHONE1,b2.MOBILEPHONE2,b2.MOBILEPHONE3,b2.FIXPHONE1,b2.FIXPHONE2,b2.FIXPHONE3)
and b.ISDEL=0
inner join KH_QZKH b3
on a.[联系方式3] in (b3.MOBILEPHONE1,b3.MOBILEPHONE2,b3.MOBILEPHONE3,b3.FIXPHONE1,b3.FIXPHONE2,b3.FIXPHONE3)
and b.ISDEL=0
inner join CUSTOMER c1
on a.[联系方式1] in (c1.MOBILEPHONE1,c1.MOBILEPHONE2,c1.MOBILEPHONE3,c1.FIXPHONE1,c1.FIXPHONE2,c1.FIXPHONE3)
inner join CUSTOMER c2
on a.[联系方式1] in (c2.MOBILEPHONE1,c2.MOBILEPHONE2,c2.MOBILEPHONE3,c2.FIXPHONE1,c2.FIXPHONE2,c2.FIXPHONE3)
inner join CUSTOMER c3
on a.[联系方式1] in (c3.MOBILEPHONE1,c3.MOBILEPHONE2,c3.MOBILEPHONE3,c3.FIXPHONE1,c3.FIXPHONE2,c3.FIXPHONE3)
------解决方案--------------------
select isnull(coalesce(t1.tel1,t1.tel2,t1.tel3),coalesce(t2.tel1,t2.tel2,t2.tel3),))
from 主表 c ,电话表1 t1,电话表2 t2
where 三表的连接条件