+ -
当前位置:首页 → 问答吧 → 存储过程中用游标循环判断非常慢(提问中含业务需求)

存储过程中用游标循环判断非常慢(提问中含业务需求)

时间:2011-12-12

来源:互联网

业务如下:
从表A中取得电话字段到表B中的三个电话字段去匹配,只要表B中有一个电话匹配,即输出该条数据,如果不匹配到表C中的三个电话字段去匹配,只要有一个电话匹配,即输出该条数据

以表A中电话循环。
※电话字段不是表中的主键

我有存储过程,利用游标去做判断输出,但是速度太慢,请大家指点下。

作者: iamheyjudy   发布时间: 2011-12-12

SQL code
SELECT *
FROM A 
WHERE EXISTS(
SELECT 1 FROM B WHERE B.PHONE1=A.PHONE OR B.PHONE2=A.PHONE OR B.PHONE3=A.PHONE
) OR EXISTS(
SELECT 1 FROM C WHERE C.PHONE1=C.PHONE OR C.PHONE2=A.PHONE OR C.PHONE3=A.PHONE
)

作者: guguda2008   发布时间: 2011-12-12

SQL code

select * from A
where exists(select 1 from b where a.tel=b.tel1 or a.tel=b.tel2 or a.tel=b.tel3)
union all
select * from A
where not exists(select 1 from b where a.tel=b.tel1 or a.tel=b.tel2 or a.tel=b.tel3)
and exists(select 1 from c where a.tel=c.tel1 or a.tel=c.tel2 or a.tel=c.tel3)

作者: duoxu1983   发布时间: 2011-12-12

引用 1 楼 guguda2008 的回复:
SQL code

SELECT *
FROM A
WHERE EXISTS(
SELECT 1 FROM B WHERE B.PHONE1=A.PHONE OR B.PHONE2=A.PHONE OR B.PHONE3=A.PHONE
) OR EXISTS(
SELECT 1 FROM C WHERE C.PHONE1=C.PHONE OR C.PHONE2=A.PHONE O……


谢谢指点.小弟不才请问下,我想区分出来每一条记录是和表B中的记录匹配还是和表C中的记录匹配。
比如 记录中电话1234567890 和表B中的一条记录匹配,输出 1
  记录中电话133000000 和表C中的一条记录匹配,输出 2

请问上记如何实现

作者: iamheyjudy   发布时间: 2011-12-12

SQL code
SELECT 
A.PHONE
,'匹配'
+CASE WHEN  A.PHONE=B.PHONE1 THEN 'B.PHONE1' ELSE '' END
+CASE WHEN  A.PHONE=B.PHONE2 THEN 'B.PHONE2' ELSE '' END
+CASE WHEN  A.PHONE=B.PHONE3 THEN 'B.PHONE3' ELSE '' END
+CASE WHEN  A.PHONE=C.PHONE1 THEN 'C.PHONE1' ELSE '' END
+CASE WHEN  A.PHONE=C.PHONE2 THEN 'C.PHONE2' ELSE '' END
+CASE WHEN  A.PHONE=C.PHONE3 THEN 'C.PHONE3' ELSE '' END
FROM A 
LEFT JOIN B ON A.PHONE=B.PHONE1 OR A.PHONE=B.PHONE2 OR A.PHONE=B.PHONE3
LEFT JOIN B ON A.PHONE=C.PHONE1 OR A.PHONE=C.PHONE2 OR C.PHONE=B.PHONE3
WHERE B.ID IS NOT NULL OR C.ID IS NOT NULL

作者: guguda2008   发布时间: 2011-12-12

C的表名打错了,自己改改吧。

作者: guguda2008   发布时间: 2011-12-12

引用 4 楼 guguda2008 的回复:
SQL code

SELECT
A.PHONE
,'匹配'
+CASE WHEN A.PHONE=B.PHONE1 THEN 'B.PHONE1' ELSE '' END
+CASE WHEN A.PHONE=B.PHONE2 THEN 'B.PHONE2' ELSE '' END
+CASE WHEN A.PHONE=B.PHONE3 THEN 'B.PHONE3' EL……


这样执行特别慢,数据大约1万条

作者: iamheyjudy   发布时间: 2011-12-12

要看B表和C表的数据量

作者: guguda2008   发布时间: 2011-12-12