sql 做嵌套查询,嵌套很多个.. 有什么好办法呢?为什么查询都不推荐使用游标?

msy_84 2010-06-03 06:19:17
多个嵌套查询,而且,其中链接的表值函数 的参数还是别的查询中传入的..这样 的查询,用什么写好呢? while 循环,没想到怎么实现。。游标倒是可以实现,但是。为什么数据库查询都不推荐使用游标呢? 数据量很大,而且有可能很多用户同时使用这个查询...
...全文
284 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
黄_瓜 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 luoyoumou 的回复:]
引用 6 楼 fredrickhu 的回复:
之所以不用游标 是因为游标是一条一条的遍历 效率不高


-- 每个数据库软件都有游标,游标当然有游标的好处,
-- 之所有有游标一说,是因为对于某些比较复杂的业务逻辑,当无法用SQL语句实现时,
-- 或者说,能够用SQL语句,但是这个语句将会有N层嵌套子查询,此时的SQL语句的效率或许比不上实现同样效果的游标遍历,此时,游标的重要性就显……
[/Quote]
游标干的是大事!

此话当真?
msy_84 2010-06-04
  • 打赏
  • 举报
回复
鱼与熊掌,不可兼得~~~
msy_84 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 luckyrandom 的回复:]
数据量大,用游标,累死服务器
[/Quote]

虽然这么说,但是SQL里也没什么别的循环啊,我要用每条 select 查询到的值做别的运算。。while 貌似写不出这种功能来吧。。。
wujinyuan 2010-06-04
  • 打赏
  • 举报
回复
只是叫你少用游标,又不是叫你不用游标。。这个功能做出来就有他的优点了。嘿嘿游标
msy_84 2010-06-04
  • 打赏
  • 举报
回复
说的也是,有的时候,游标非用不可`~~~
Q315054403 2010-06-04
  • 打赏
  • 举报
回复
数据量大,用游标,累死服务器
summer0208 2010-06-03
  • 打赏
  • 举报
回复
唉,每次来都只能看高手怎么解答。。。
永生天地 2010-06-03
  • 打赏
  • 举报
回复
游标在处理复杂业务时,必定会派上用处
luoyoumou 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fredrickhu 的回复:]
之所以不用游标 是因为游标是一条一条的遍历 效率不高
[/Quote]

-- 每个数据库软件都有游标,游标当然有游标的好处,
-- 之所有有游标一说,是因为对于某些比较复杂的业务逻辑,当无法用SQL语句实现时,
-- 或者说,能够用SQL语句,但是这个语句将会有N层嵌套子查询,此时的SQL语句的效率或许比不上实现同样效果的游标遍历,此时,游标的重要性就显露出来了

-- 一句话:小事情,别找游标,直接用SQL搞定!
-- 游标干的是大事!
--小F-- 2010-06-03
  • 打赏
  • 举报
回复
之所以不用游标 是因为游标是一条一条的遍历 效率不高
luoyoumou 2010-06-03
  • 打赏
  • 举报
回复
SELECT 表值函数1(n1.news_id,s1.shuxing_1) as func_val
FROM [新闻表] n1 FULL JOIN [属性表] s1 ON 1=1
UNION ALL
SELECT 表值函数2(n2.news_id,s2.) as func_val
FROM [新闻表] n2 FULL JOIN [另一个属性表] s2 ON 1=1;
xcliang2004 2010-06-03
  • 打赏
  • 举报
回复
ding!!!!!!!!!!!!!!!!!!!!!!
msy_84 2010-06-03
  • 打赏
  • 举报
回复
- -! 接受批评~

补充下问题,
假如我有一个查询

ECLARE cussor1 CURSOR FOR
select news_id from 新闻表 into @newsid

OPEN cussor1
FETCH NEXT FROM cussor1 INTO @newsid

WHILE @@FETCH_STATUS = 0
BEGIN
ECLARE cussor2 CURSOR FOR
select shuxing_1 from 属性表 into @shunxing
OPEN cussor2
FETCH NEXT FROM cussor2 INTO @shunxing
WHILE @@FETCH_STATUS = 0
begin
select * from 表值函数1(@newsid,@shunxing)
FETCH NEXT FROM cussor2 INTO @shunxing

end
CLOSE cussor2
DEALLOCATE cussor2
ECLARE cussor3 CURSOR FOR
select shuxing_2 from 另一个属性表 into @shunxing2
OPEN cussor3
FETCH NEXT FROM cussor3 INTO @shunxing
WHILE @@FETCH_STATUS = 0
begin
select * from 表值函数2(@newsid,@shunxing2)
FETCH NEXT FROM cussor2 INTO @shunxing2
end
CLOSE cussor3
DEALLOCATE cussor3

END
CLOSE cussor1
DEALLOCATE cussor1

这样一个查询,我要得到 两个表值函数的联合结构,这样写,数据量很大的时候,是不是很慢?有什么别的方法吗?
htl258_Tony 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 beirut 的回复:]
假如我这样描述,你能怎么帮我?
提问也是一门学问
[/Quote]
弓虽
黄_瓜 2010-06-03
  • 打赏
  • 举报
回复
假如我这样描述,你能怎么帮我?
提问也是一门学问

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧