SQL UPDATE语句中的GROUP BY 要如何写?

vivazheng 2019-09-11 12:46:01
A表有字段A1、A2
B表有字段B1、B2、B3
C表有字段C1、C2、C3,C4
现在需要对B表的字段B3 –UPDATE B SET B.B3= C.C3
如下写法时会报错
update B set B..B3=(select C2, SUM (C3) as C3
from C
where C4='30'
GROUP BY C2 )
from
A,B,C
where
A.A1=B.B1
and
B.B2=C.C1
And
A.A2='XX' AND B.B2='XX' AND C.C4='XX'
报错提示:当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式。


问题在于C表的C3需要根据C2相同的内容相加,这个UPDATE语句应该怎么写
...全文
2089 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
vivazheng 2019-09-11
  • 打赏
  • 举报
回复
引用 15 楼 二月十六 的回复:
[quote=引用 14 楼 vivazheng 的回复:] [quote=引用 13 楼 二月十六 的回复:] [quote=引用 12 楼 vivazheng 的回复:] [quote=引用 11 楼 二月十六 的回复:] [quote=引用 10 楼 vivazheng 的回复:] 原来SQL声明不一定要用AS的,明白了。那版主,不用到AS的时候我怎么读懂别人写的语句是声明呢?有什么决窍吗?我发觉得在论坛里比在书上学得快很多呢。现在想试着读懂别人写的语句。
额,这个就几种形式,看多了就明白了 表名 别名 (select * from 表) 别名[/quote] 好的,有不明白多向你们请教,希望不要嫌小白问题太简多拒回答啊。[/quote] 越小白问题越好,只要结贴给分就行[/quote] 别说分了,直接红包都没有问题啦,好过去什么培训班啦。能不能留个V呀[/quote] 看我简介,进群[/quote] 好,进群中秋夜我发红包
二月十六 2019-09-11
  • 打赏
  • 举报
回复
引用 14 楼 vivazheng 的回复:
[quote=引用 13 楼 二月十六 的回复:] [quote=引用 12 楼 vivazheng 的回复:] [quote=引用 11 楼 二月十六 的回复:] [quote=引用 10 楼 vivazheng 的回复:] 原来SQL声明不一定要用AS的,明白了。那版主,不用到AS的时候我怎么读懂别人写的语句是声明呢?有什么决窍吗?我发觉得在论坛里比在书上学得快很多呢。现在想试着读懂别人写的语句。
额,这个就几种形式,看多了就明白了 表名 别名 (select * from 表) 别名[/quote] 好的,有不明白多向你们请教,希望不要嫌小白问题太简多拒回答啊。[/quote] 越小白问题越好,只要结贴给分就行[/quote] 别说分了,直接红包都没有问题啦,好过去什么培训班啦。能不能留个V呀[/quote] 看我简介,进群
vivazheng 2019-09-11
  • 打赏
  • 举报
回复
引用 13 楼 二月十六 的回复:
[quote=引用 12 楼 vivazheng 的回复:] [quote=引用 11 楼 二月十六 的回复:] [quote=引用 10 楼 vivazheng 的回复:] 原来SQL声明不一定要用AS的,明白了。那版主,不用到AS的时候我怎么读懂别人写的语句是声明呢?有什么决窍吗?我发觉得在论坛里比在书上学得快很多呢。现在想试着读懂别人写的语句。
额,这个就几种形式,看多了就明白了 表名 别名 (select * from 表) 别名[/quote] 好的,有不明白多向你们请教,希望不要嫌小白问题太简多拒回答啊。[/quote] 越小白问题越好,只要结贴给分就行[/quote] 别说分了,直接红包都没有问题啦,好过去什么培训班啦。能不能留个V呀
二月十六 2019-09-11
  • 打赏
  • 举报
回复
引用 12 楼 vivazheng 的回复:
[quote=引用 11 楼 二月十六 的回复:] [quote=引用 10 楼 vivazheng 的回复:] 原来SQL声明不一定要用AS的,明白了。那版主,不用到AS的时候我怎么读懂别人写的语句是声明呢?有什么决窍吗?我发觉得在论坛里比在书上学得快很多呢。现在想试着读懂别人写的语句。
额,这个就几种形式,看多了就明白了 表名 别名 (select * from 表) 别名[/quote] 好的,有不明白多向你们请教,希望不要嫌小白问题太简多拒回答啊。[/quote] 越小白问题越好,只要结贴给分就行
vivazheng 2019-09-11
  • 打赏
  • 举报
回复
引用 11 楼 二月十六 的回复:
[quote=引用 10 楼 vivazheng 的回复:] 原来SQL声明不一定要用AS的,明白了。那版主,不用到AS的时候我怎么读懂别人写的语句是声明呢?有什么决窍吗?我发觉得在论坛里比在书上学得快很多呢。现在想试着读懂别人写的语句。
额,这个就几种形式,看多了就明白了 表名 别名 (select * from 表) 别名[/quote] 好的,有不明白多向你们请教,希望不要嫌小白问题太简多拒回答啊。
二月十六 2019-09-11
  • 打赏
  • 举报
回复
引用 10 楼 vivazheng 的回复:
原来SQL声明不一定要用AS的,明白了。那版主,不用到AS的时候我怎么读懂别人写的语句是声明呢?有什么决窍吗?我发觉得在论坛里比在书上学得快很多呢。现在想试着读懂别人写的语句。
额,这个就几种形式,看多了就明白了 表名 别名 (select * from 表) 别名
vivazheng 2019-09-11
  • 打赏
  • 举报
回复
引用 9 楼 二月十六 的回复:
[quote=引用 8 楼 vivazheng 的回复:] [quote=引用 2 楼 二月十六 的回复:] 这个语句的问题是
(select C2, SUM (C3) as C3
 from #C
 where C4='30'   
 GROUP BY C2  )
会返回多条, 比如 C2 C3 1 100 2 200 如果返回这个结果了,B3就没办法复制了 试试这样
UPDATE B
   SET B.B3 = T.C3
  FROM A,
       c,
  (SELECT C2, SUM(C3) AS C3 FROM c WHERE C4 = '30' GROUP BY C2) t
 WHERE A.A1 = B.B1
   AND B.B2 = c.C1
   AND c.C2 = t.c2;
不懂就无耻多问一下,你的这个T为什么不需要声明呢?[/quote] 声明了,t就是下边这个
(SELECT C2, SUM(C3) AS C3 FROM c WHERE C4 = '30' GROUP BY C2) t
[/quote] 原来SQL声明不一定要用AS的,明白了。那版主,不用到AS的时候我怎么读懂别人写的语句是声明呢?有什么决窍吗?我发觉得在论坛里比在书上学得快很多呢。现在想试着读懂别人写的语句。
二月十六 2019-09-11
  • 打赏
  • 举报
回复
引用 8 楼 vivazheng 的回复:
[quote=引用 2 楼 二月十六 的回复:] 这个语句的问题是
(select C2, SUM (C3) as C3
 from #C
 where C4='30'   
 GROUP BY C2  )
会返回多条, 比如 C2 C3 1 100 2 200 如果返回这个结果了,B3就没办法复制了 试试这样
UPDATE B
   SET B.B3 = T.C3
  FROM A,
       c,
  (SELECT C2, SUM(C3) AS C3 FROM c WHERE C4 = '30' GROUP BY C2) t
 WHERE A.A1 = B.B1
   AND B.B2 = c.C1
   AND c.C2 = t.c2;
不懂就无耻多问一下,你的这个T为什么不需要声明呢?[/quote] 声明了,t就是下边这个
(SELECT C2, SUM(C3) AS C3 FROM c WHERE C4 = '30' GROUP BY C2) t
vivazheng 2019-09-11
  • 打赏
  • 举报
回复
引用 2 楼 二月十六 的回复:
这个语句的问题是
(select C2, SUM (C3) as C3
 from #C
 where C4='30'   
 GROUP BY C2  )
会返回多条, 比如 C2 C3 1 100 2 200 如果返回这个结果了,B3就没办法复制了 试试这样
UPDATE B
   SET B.B3 = T.C3
  FROM A,
       c,
  (SELECT C2, SUM(C3) AS C3 FROM c WHERE C4 = '30' GROUP BY C2) t
 WHERE A.A1 = B.B1
   AND B.B2 = c.C1
   AND c.C2 = t.c2;
不懂就无耻多问一下,你的这个T为什么不需要声明呢?
卖水果的net 2019-09-11
  • 打赏
  • 举报
回复

-- 给你写了个例子,你观察一下

create table m(id int, num int default 0);
create table s(mid int, num int);
insert into m(id) values(1),(2),(3)
insert into s values(1,100),(1,200),(2,50)
go
select * from m
go
update A
set num =(select isnull(sum(num),0) from s where s.mid = A.id)
from m A
go
select * from m
go
drop table m,s
go


(3 行受影响)

(3 行受影响)
id          num
----------- -----------
1           0
2           0
3           0

(3 行受影响)


(3 行受影响)
id          num
----------- -----------
1           300
2           50
3           0

(3 行受影响)




vivazheng 2019-09-11
  • 打赏
  • 举报
回复
引用 5 楼 卖水果的net 的回复:
[quote=引用 4 楼 vivazheng 的回复:] [quote=引用 1 楼 卖水果的net 的回复:] update B set B..B3=(select SUM (C3) as C3 from C where C4='30' and C.C4='XX' and B.B2=C.C1 ) from A,B where A.A1=B.B1 And A.A2='XX' AND B.B2='XX' 试试这个
是的,我原来也是这样写,会返来多条。又跟三楼学到一个思维。[/quote] 不可能返回多条的,如还有兴趣,建议你做一个对比。[/quote] 对喔,你的没有GROUP BY,但加了B表的B2字段,但有个疑问,加了SUM不需要GROUP BY吗?我是新手,不懂就无耻下问了,还望多请教。
卖水果的net 2019-09-11
  • 打赏
  • 举报
回复
引用 4 楼 vivazheng 的回复:
[quote=引用 1 楼 卖水果的net 的回复:] update B set B..B3=(select SUM (C3) as C3 from C where C4='30' and C.C4='XX' and B.B2=C.C1 ) from A,B where A.A1=B.B1 And A.A2='XX' AND B.B2='XX' 试试这个
是的,我原来也是这样写,会返来多条。又跟三楼学到一个思维。[/quote] 不可能返回多条的,如还有兴趣,建议你做一个对比。
vivazheng 2019-09-11
  • 打赏
  • 举报
回复
引用 1 楼 卖水果的net 的回复:
update B set B..B3=(select SUM (C3) as C3 from C where C4='30' and C.C4='XX' and B.B2=C.C1 ) from A,B where A.A1=B.B1 And A.A2='XX' AND B.B2='XX' 试试这个
是的,我原来也是这样写,会返来多条。又跟三楼学到一个思维。
vivazheng 2019-09-11
  • 打赏
  • 举报
回复
引用 2 楼 二月十六 的回复:
这个语句的问题是
(select C2, SUM (C3) as C3
 from #C
 where C4='30'   
 GROUP BY C2  )
会返回多条, 比如 C2 C3 1 100 2 200 如果返回这个结果了,B3就没办法复制了 试试这样
UPDATE B
   SET B.B3 = T.C3
  FROM A,
       c,
  (SELECT C2, SUM(C3) AS C3 FROM c WHERE C4 = '30' GROUP BY C2) t
 WHERE A.A1 = B.B1
   AND B.B2 = c.C1
   AND c.C2 = t.c2;
顿塞一开,顿塞一开,顿塞一开,顿塞一开,谢谢了,谢谢了。
卖水果的net 2019-09-11
  • 打赏
  • 举报
回复
update B set B..B3=(select SUM (C3) as C3 from C where C4='30' and C.C4='XX' and B.B2=C.C1 ) from A,B where A.A1=B.B1 And A.A2='XX' AND B.B2='XX' 试试这个
二月十六 2019-09-11
  • 打赏
  • 举报
回复
这个语句的问题是
(select C2, SUM (C3) as C3
from #C
where C4='30'
GROUP BY C2 )

会返回多条,
比如
C2 C3
1 100
2 200
如果返回这个结果了,B3就没办法复制了
试试这样
UPDATE B
SET B.B3 = T.C3
FROM A,
c,
(SELECT C2, SUM(C3) AS C3 FROM c WHERE C4 = '30' GROUP BY C2) t
WHERE A.A1 = B.B1
AND B.B2 = c.C1
AND c.C2 = t.c2;

22,295

社区成员

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

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