关系逻辑训练之一.逻辑优化

fcuandy 2011-12-16 04:48:35
加精
sqlserver 05/08出现了一些新语法的支持来应对以前一些往往需写循环才能实现的东西。
将4年前sql2k下一条语句实现的问题重发出来,看看逻辑最优化。

不考滤性能,只考滤逻辑上最优化。

DECLARE @a TABLE(ia  INT, na INT, x INT NULL)
INSERT @a SELECT 1, 5, NULL
UNION ALL SELECT 2 , 20,NULL
UNION ALL SELECT 3 ,22,NULL

DECLARE @b TABLE(ib INT, nb INT)
INSERT @b SELECT 1, 9
UNION ALL SELECT 2 , 18
UNION ALL SELECT 3 ,19


要求
a表为目标表, 更新a表中x值,规则如下

1, 只选取nb小于na的值
2, 选取最接近于na的nb, 即在小于na的nb集合中取最大的nb
3, 每个nb最多使用一次, 即不能重复使用。

解释如下

以 a表第一行记录为例
在 b表中取nb小于na (5)的记录中最大的nb, 目测结果所有nb均大于5, 取不到
目标表记录下移至第二行,取nb小于na(20)的最大nb, 三行b表记录之nb均小于20, 取最大值,为19, 即将x更新为19
目标表下移至第三行,取nb小于na(22)的最大nb,三行b表记录之nb均小于22,取大值为19,但依第三条规则,每个nb最多使用一次,19已被a表第二行记录使用,则排除之,取18

RT.

你可以写循环,不过与题脱远了。

可以写为读查询或更新查询。(select/update均可)

关系逻辑训练之一
难度 三星半
...全文
3238 91 打赏 收藏 转发到动态 举报
写回复
用AI写文章
91 条回复
切换为时间正序
请发表友善的回复…
发表回复
黄_瓜 2012-02-22
  • 打赏
  • 举报
回复
偶像,该公布答案了吧
zhangshengping1024 2011-12-27
  • 打赏
  • 举报
回复
我要抓紧学习,现在还看不懂啊!
xinfengj6 2011-12-26
  • 打赏
  • 举报
回复
现在看看 怎么
ksaponka_tang 2011-12-24
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 ssp2009 的回复:]
SQL code

DECLARE @a TABLE(ia INT, na INT, x INT NULL)
INSERT @a SELECT 1, 5, NULL
UNION ALL SELECT 2 , 20,NULL
UNION ALL SELECT 3 ,22,NULL

DECLARE @b TABLE(ib INT, nb INT)
INSERT @b SELE……
[/Quote]
正确...
stszd604 2011-12-23
  • 打赏
  • 举报
回复
凑个热闹
~!@~@!~@!~
lmc158 2011-12-22
  • 打赏
  • 举报
回复
DECLARE @a TABLE(ia INT, na INT, x INT NULL)
INSERT @a SELECT 1, 5, NULL
UNION ALL SELECT 2 , 20,NULL
UNION ALL SELECT 3 ,22,NULL

DECLARE @b TABLE(ib INT, nb INT)
INSERT @b SELECT 1, 9
UNION ALL SELECT 2 , 18
UNION ALL SELECT 3 ,19


CS1479416304 2011-12-22
  • 打赏
  • 举报
回复
回帖是一个好习惯 好习惯
xmyohmy1 2011-12-20
  • 打赏
  • 举报
回复
果断收藏,多谢楼主分享!
昵称被占用了 2011-12-20
  • 打赏
  • 举报
回复
q465897859 2011-12-20
  • 打赏
  • 举报
回复
fuxiaoyang13 2011-12-20
  • 打赏
  • 举报
回复
用多少次应该没关系!!!
Zhen (Evan) Wang 2011-12-20
  • 打赏
  • 举报
回复

create procedure A_UPDATE
@nb int
as
update a set a.na=@nb,ia=(select count(*) from na)
where @nb=(select nb from b where nb<na)

exec A_UPDATE

没测试,用变量代替,不算使用两次吧?
米娅 2011-12-20
  • 打赏
  • 举报
回复
galford_1983 2011-12-20
  • 打赏
  • 举报
回复
好东西,收藏了。
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 guguda2008 的回复:]

SQL code
DECLARE @a TABLE(ia INT, na INT, x INT NULL)
INSERT @a SELECT 1, 5, NULL
UNION ALL SELECT 2 , 20,NULL
UNION ALL SELECT 3 ,22,NULL

DECLARE @b TABLE(ib INT, nb INT)
INSERT @b SELECT 1, ……
[/Quote]`
fanghui2268 2011-12-19
  • 打赏
  • 举报
回复
确实不错,上班不方便,下班继续看看
小金牛儿 2011-12-19
  • 打赏
  • 举报
回复
果断收藏,多谢楼主分享!
SW_luke 2011-12-19
  • 打赏
  • 举报
回复
不是太懂, 顶起来!
wxwlll 2011-12-19
  • 打赏
  • 举报
回复
SQL忘得差不多了
fcuandy 2011-12-19
  • 打赏
  • 举报
回复
其实这个问题count根本出不来的.
加载更多回复(37)

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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