欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

帮忙 帮忙 sql server语句 小弟我理解不了

更新时间: 2014-01-05 02:18:07 责任编辑: Author_N1

 

帮忙 帮忙 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是可以的
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 02:18:07
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/8225/
本文WWW.DOC100.NET DOC100.NET版权所有。