日期:2014-05-18  浏览次数:20594 次

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 三表的连接条件