请大家帮忙,有没有只用1次检索就获得以下结果的sql语句,如果不用临时表的

巴拉莱卡 2006-05-13 04:36:24
假设有一表table_x 含三列a int,b int,c varchar(20)
a与b的范围between 1 and 100
不存在a,b都相等的记录(唯一性)
排序规则1:a列升序
排序规则2:b列升序
规则1>规则2


....
2,1,aaa
3,3,bbb
3,4,bde
4,1,f231
....


问:
假设有一记录(33,33,ffer)
如表table_x中存在此记录则raiserror报错
如不存在则问按照排序规则在此记录之前1位的记录的c列值是多少
不使用临时表的情况下已后台sql创建存储过程返回,尽量用少的查询次数 by sqlserver2000

我写了两次查询才搞定,,,,有没有好的办法啊
...全文
86 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
巴拉莱卡 2006-05-14
  • 打赏
  • 举报
回复
第二个问题已经有人告诉我了
是用not exists
这里要谢谢热心帮忙的同志了

select * from table_x where not exists(select * from table_y where table_x.a =
table_y.a and table_x.b = table_y.b)
子查询实际上不产生任何数据;它只返回 TRUE 或 FALSE 值。
应该是基于对table_x表的每条记录进行一次not in 的检索@table_y.返回true or false
量级是O(count(table_x)*count(table_y))

我多嘴问一下.如果是嵌套2表查询.不问结果问速度的话
是记录多的表做子查询快,还是少的快
kangqilie 2006-05-14
  • 打赏
  • 举报
回复
-----粗略的写一下,用到了子查询,语法有错的

declare @A_VALUE int
declare @B_VALUE int
declare @Return_C_Value varchar(20)
declare @NUM int
declare cursor_1 cursor for
select top 1 a.c,b.num from table_x a left join (
select a,b,count(1) as num from table_x where a=@A_VALUE and b=@B_VALUE
)b on a.a=b.a and a.b=b.b
where a.a<@A_VALUE and a.b<@A_VALUE
open cursor_1
fetch next from cursor_1 into @Return_C_Value,@NUM
if @NUM<>1
raiserror 1
else
return @Return_C_Value

deallocate cursor_1
close cursor_1
巴拉莱卡 2006-05-14
  • 打赏
  • 举报
回复
kangqilie兄弟的意思基本上明白地
多谢了

代码中子查询用了聚集但是没有两列未包含在聚合函数中,并且没有 GROUP BY 子句
好象是close在前 deallocate 在后
只前游标的话排序规则要倒一下

over了
巴拉莱卡 2006-05-13
  • 打赏
  • 举报
回复
是已经存在table_x,且有一些记录了
我还是没有搞定,,
现在用碰到一个问题了
就是前一个问提的后续问题
假设有表table_y,结构与table_x相同,但记录不同
问写一条查询语句,包含存在table_x,且不存在于table_y的记录
其实表table_x,table_y 的a,b两个列放的是坐标,c放状态,
问基于两个列的标示列的集合(a,b) table_x - table_y
能用尽量简单的方法实现么

会飞的小洋洋 2006-05-13
  • 打赏
  • 举报
回复
select a,b,c from table_x where a between 1 and 100 and b between 1 and 100
and a<>b order by a,b
巴拉莱卡 2006-05-13
  • 打赏
  • 举报
回复
不能把需要查询的记录插入进表中哦

22,209

社区成员

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

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