请教一条简单的sql语句! 送分!

超凡 2011-07-27 04:59:14
create table table1(id int,plan varchar(20),Area varchar(20), output int,DailyOutput int)


数据如下
id plan Area output DailyOutput
1 P1 A1 500 1500
2 P1 A2 500 1500
3 P1 A3 500 1500
4 P2 A1 500 1400
5 P2 A2 400 1400
6 P2 A3 500 1400


我在修改output的时候DailyOutput 也要修改

假如我要修改A1的output 为300 那对应的P1的DailyOutput 全部修改为1300

在修改A1的数据最好以ID为条件,因为可能有重复数据!

用一条语update语句实现!
...全文
1196 62 打赏 收藏 转发到动态 举报
写回复
用AI写文章
62 条回复
切换为时间正序
请发表友善的回复…
发表回复
drymartell 2011-08-01
  • 打赏
  • 举报
回复
update table1
set dailyoutput = 1300
where plan='p1' and decode(sign((select count(*) from table1 where id=1 and area='a1' and output='300')-0),1,'Y','N')='Y'
quanziquantao 2011-08-01
  • 打赏
  • 举报
回复
个人感觉,LZ你对自己需求和你想写的SQL之间的矛盾没有弄明白,你说了,修改A1的时候按ID来,这个ID应该是你这个表的主键,所以按这个需求,你每次修改的记录就已经限定在一条记录上了,这个时候你要想在这个SQl上改所有P1的记录,显然是不可能的。

上面也有人说了用触发器,是可以达到效果,不过还是建议你不要轻易的使用表级的触发器,不利于维护,而且也可能造成性能上的问题。

个人建议,如果你只是单纯的修改某些记录,那就按照你的业务逻辑,多写几条SQL语句,如果是需要经常重用这样的修改逻辑,那我建议你把它们封装到一个存储过程中去,这样的好处是:一、调用的程序简单;二、程序容易维护。

还有一点属于个人经验,仅供参考:不要想着用一条SQL解决所有事情,写SQL同样需要清晰的思路和条理。
cr75608859 2011-07-31
  • 打赏
  • 举报
回复
为什么不用触发器!哎
xiaobaihongye404 2011-07-30
  • 打赏
  • 举报
回复
我觉得楼主有点坑爹……
寻道模式 2011-07-30
  • 打赏
  • 举报
回复
说真的,没看懂你的问题,最好举例说明
长笛党希望 2011-07-29
  • 打赏
  • 举报
回复
公司为啥不让用触发器呢?我有点奇怪不知楼主能否给个解释呢??
l4kangaxx 2011-07-29
  • 打赏
  • 举报
回复
表面上来看你可以用一句sql这样写

update #table1 set output = 3, DailyOutput = (select SUM(output) from #table1 b where b.plans = a.plans)
from #table1 a

但是实际上那个dailyoutput是错的,因为一次update共享一个行锁所以得到的那个dailyoutput是错误的,它不能体现出output的实际变化
这里你必须用两次update,第一次update output ,第二次 update dailyoutput
的确很多公司不允许触发器,说明其高阶管理人员能力有限,那么你可以用存储过程,如果连存储过程都不行,你就在前台代码里面写两句sql,总不会连前台分两次调sql都不允许吧?
另外lz别那么急躁么,写程序是一辈子的事,不要急,不要急!
qingmingcom 2011-07-29
  • 打赏
  • 举报
回复
太恶劣了。多的不说了。
勿勿 2011-07-29
  • 打赏
  • 举报
回复
update tb set output=200,dailyoutput=300 where id=(select id form tb whrere plan=A1 ADN aREA=500)
wangjun3231 2011-07-29
  • 打赏
  • 举报
回复
后面的业务是, 给一个地区,能查出其上一级是谁,下一级是谁,最高级是谁,最低父节点是谁,一个省下面有多少个具体地区...这些全部是用一条SQL语句来完成的..
还有单条查询通常比存储过程来的更效率,再说...Oracle的存储过程,在用的时候不是那么方便..(相比MSSQL)

触发器,在不少的小中型企业...确实有不允许用的规定....原因自己去查.不罗嗦..


LZ的问题有点描述不清楚:
1.你的P1里有A1 ,P2里也有A1...你说P1全部改为1300;那P2的需要不?
2.还有A1的数据,已ID为条件...OK...那你到底哪个字段是条件?Area 还是ID?
wangjun3231 2011-07-29
  • 打赏
  • 举报
回复
说LZ的人只能说对SQL理解不够....
说白了,现在的程序员...没几个能写出超过3层嵌套的SQL语句....

还有拿范式说的.... 我当时见过一个电信关于地区的表...
用于描述 C县属于B市,B市属于A省....子节点可以无限... 父节点可以有N个同级子节点
这种关系,不是一些简单的什么范式就可以来规定的....
但是业务就在那...你能给电信说...你这不符合规范!我们不做吗??


SQL的灵活性...比JavaScript还要高
qq52776913 2011-07-29
  • 打赏
  • 举报
回复
楼猪脑袋小时候肯定被门夹过
萝卜 2011-07-29
  • 打赏
  • 举报
回复
update t1
set output = case when t1.id = t2.id then 300 else t1.output end ,
dailyoutput = t1.DailyOutput - t2.output + 300
from table1 t1
join table1 t2
on t1.plan = t2.plan
and t2.id = 1

1 和 300 请自行定义变量。
nuey1985 2011-07-28
  • 打赏
  • 举报
回复
假设表为table1,你要更新的id为1,output为300,对应的plan的dailyoutput的值为1300,可以这么写,算一条语句不?

update table1 set outputs=(case when id=1 then 300 else outputs end),[DailyOutput]=1300
where plans in (select plans from table1 where area=(select area from table1 where id=1))
oO寒枫Oo 2011-07-28
  • 打赏
  • 举报
回复
楼主
人家都是过来帮你的 你的态度怎么这么恶略 。
对的就接受 不对的也要说明原因。
妈的反正我是很淡定了 以前被狗咬过一次 最悲哀的是它咬了你 你是不好意思去回咬的。
超凡 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 ssp2009 的回复:]
你以为人家稀罕你的分?真他妈脑残。就你这样的,想好好学,他妈的就拿出点虚心请教的心态来,fuck
[/Quote]

素质真差! 还真不知道csdn上面还有这种鸟!
超凡 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 ssp2009 的回复:]
引用 38 楼 hncelfhv 的回复:
引用 17 楼 geniuswjt 的回复:
不能用触发器这不坑爹么


看看小三是怎么实现的吧!
告诉过你那是有问题的?你没脑子是不是,自己想过没有
[/Quote]

自己没本事写出来,出啥风头,跑出来骂人!
这么简单的sql没写出来真不知道你排名怎么来的! 还有脸出来骂人!
oO寒枫Oo 2011-07-28
  • 打赏
  • 举报
回复
楼主 你要的结果是1300 1500-300=?
超凡 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 ssp2009 的回复:]
你以为人家稀罕你的分?真他妈脑残。就你这样的,想好好学,他妈的就拿出点虚心请教的心态来,fuck
[/Quote]

晕倒! 你脑残吧! 我是学得不好!所以才来csdn上请教,你学得好你写出来了!
超凡 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 ssp2009 的回复:]
引用 38 楼 hncelfhv 的回复:
引用 17 楼 geniuswjt 的回复:
不能用触发器这不坑爹么


看看小三是怎么实现的吧!
告诉过你那是有问题的?你没脑子是不是,自己想过没有
[/Quote]

请教! 问题出在哪里?

加载更多回复(42)

34,590

社区成员

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

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