我有表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
------解决方案--------------------
对了 在表名后面加个 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个字符