帮忙 帮忙 SQL SERVER语句 小弟我理解不了

帮忙 帮忙 SQL SERVER语句 我理解不了!1.这种检索方式正常select ID, NAME from yjmc where ID IN (81261

帮忙 帮忙 SQL SERVER语句 我理解不了!

1.这种检索方式正常
select ID, NAME from yjmc where ID IN ('8126130308','8126130208')
--------------------------
查询结果:
ID        NAME
8126130308采气管理三区
8126130208采气管理二区

2. 查询 为什么返回是空?
select ID, NAME from yjmc where ID IN 
(select '('''+ REPLACE(KHDW,',',''',''')+''')' as khdw from SYS_KHZB where KMDM='1003')
---------------------------
查询结果:
ID        NAME

3.分解第二步
(select '('''+ REPLACE(KHDW,',',''',''')+''')' as khdw from SYS_KHZB where KMDM='1003')
---------------------------
查询结果:
khdw
('8126130308','8126130208')


谁给讲讲2里面的SQL语句错在哪里,出不来结果?

[解决办法]
因为,第2种方法,

select ID, NAME from yjmc where ID IN 
(select '('''+ REPLACE(KHDW,',',''',''')+''')' as khdw from SYS_KHZB where KMDM='1003')

你已经把khdw的值修改了 ,所以就出不来了,必须是先where 过滤数据,然后在结果集,再处理 
 '('''+ REPLACE(KHDW,',',''',''')+''')' as khdw 这个
[解决办法]
实际上出来的集合是 ‘('8126130308','8126130208')’这个东西,并不是你所要的8126130308和8126130208的集合。

解决办法是你把它放进变量里,然后通过拆分成8126130308和8126130208的集合,然后在进行使用!
[解决办法]
还有,第1个之所以能运行是因为in  ('8126130308','8126130208')

注意这里的括号,不是字符串,而第2种是:

 '('''+ REPLACE(KHDW,',',''',''')+''')' 

也就是说,括号,也是字符串了。

不过,你可以考虑改成这样,也行,这个应该是要的:

select ID, NAME from yjmc 
where exists(select 1
             from SYS_KHZB 
             where KMDM='1003'
             and charindex(','+yjmc.id+',',','+KHDW+',')>0 )

[解决办法]
其实关键是你的khdw列是用逗号分割的字符串,所以用这种办法来处理,虽然也有其他的办法,但其他的写法跟复杂
[解决办法]
select ''''+ REPLACE(KHDW,',',''',''')+'''' as khdw from SYS_KHZB where KMDM='1003'
这个结果是什么?你的ID是int类型吗?
[解决办法]
 

引用:
Quote: 引用:

还有,第1个之所以能运行是因为in  ('8126130308','8126130208')

注意这里的括号,不是字符串,而第2种是:

 '('''+ REPLACE(KHDW,',',''',''')+''')' 

也就是说,括号,也是字符串了。

不过,你可以考虑改成这样,也行,这个应该是要的:
select ID, NAME from yjmc 
where exists(select 1
             from SYS_KHZB 
             where KMDM='1003'
             and charindex(','+yjmc.id+',',','+KHDW+',')>0 )


当家的你这个方法很有效,我阅读起来还是感觉费劲,exists  charindex,老大这语句没法在简化了吗?




楼主会C#吗? 了解 Split方法吗?我这样写,看你能理解不。

select ID, NAME from yjmc where ID IN 
(
/*将KHDW以逗号为分割符进行拆分*/
select r1.Value as khdw from SYS_KHZB
CROSS APPLY(
SELECT * FROM dbo.[Split](KHDW,',') s
) r1
where KMDM='1003'
);
--split 方法见 http://blog.csdn.net/feiazifeiazi/article/details/17242355

[解决办法]
这个用动态sql是可以的