当前位置: 代码迷 >> Sql Server >> SQL语句的优化,速度很慢,求其他方法实现,该怎么解决
  详细解决方案

SQL语句的优化,速度很慢,求其他方法实现,该怎么解决

热度:72   发布时间:2016-04-24 19:31:37.0
SQL语句的优化,速度很慢,求其他方法实现
我有表a 数据为

id   name
1    1002
2    1003
3    1004

表B 数据为

id  namestr
1   1002|1005|
2   1004|
3   1008|

最后我想得出结构

id   name   flag
1    1002   1
2    1003   0
3    1004   1

简单的说,就是A表中的一个字段NAME 在B表中出现过就输出FLAG=1

我试着用标量值函数来写是可以,数据少可以,但是数据多就很慢了,有什么别的方法吗?

------解决方案--------------------

--drop table A
--drop table B

create table a(id  int,  name varchar(20))

insert into A
select 1   , '1002'
union all select 2  ,  '1003'
union all select 3  ,  '1004'

create table b(id  int,  namestr varchar(30))

insert into b
select 1  , '1002
------解决方案--------------------
1005
------解决方案--------------------
'
union all select 2  ,  '1004
------解决方案--------------------
'
union all select 3  ,  '1008
------解决方案--------------------
'


select id,
       name,
       case when  exists 
  (
select 1
from b
where charindex('
------解决方案--------------------
'+a.name+'
------解决方案--------------------
','
------解决方案--------------------
'+b.namestr) > 0
  )
  then 1
        else 0
   end as flag
from a
/*
id name flag
1 1002 1
2 1003 0
3 1004 1
*/

------解决方案--------------------

WITH a(id,NAME) AS
(
SELECT 1,'1002' UNION ALL
SELECT 2,'1003' UNION ALL
SELECT 3,'1004'
)
,b (id,namestr) AS
(
SELECT 1,'1002
------解决方案--------------------
1005
------解决方案--------------------
' UNION ALL
SELECT 2,'1004
------解决方案--------------------
' UNION ALL
SELECT 3,'1008
------解决方案--------------------
'
)
,c AS
(
SELECT (SELECT RTRIM(namestr) AS [text()] FROM b FOR XML PATH('')) namestr
)
SELECT a.*,CASE WHEN CHARINDEX(a.NAME,c.namestr)>0 THEN 1 ELSE 0 END flag
FROM a,c

------解决方案--------------------
引用:
Quote: 引用:

呵呵,你先试试看,性能怎样


性能不好。很慢


对了 在表名后面加个 with(nolock)试试,比如:

a with(nolock)
b with(nolock)

防止阻塞问题。
------解决方案--------------------
再试试函数版本的:




--1.函数
if exists(select * from sys.objects where name = 'f_splitSTR' and type = 'tf')
   drop function dbo.f_splitSTR
go

create function dbo.f_splitSTR
(
@s varchar(8000),     --要分拆的字符串
@split varchar(10)    --分隔字符

returns @re table(                      --要返回的临时表
                     col varchar(1000)  --临时表中的列 
                 )
as
begin   
  declare @len int
  
  set @len = LEN(@split)      --分隔符不一定就是一个字符,可能是2个字符
  相关解决方案