mysql5资源共享

 找回密码
 立即注册
查看: 134|回复: 10

[MS-SQL Server] 【基础】请问“子查询引用外层查询的列”该怎么写?

[复制链接]

2

主题

4

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2019-7-18 17:59:47 | 显示全部楼层 |阅读模式
ifobject_id('tempdb.dbo.#k')isnotnulldroptable#k
CREATETABLE#k(codevarchar(6),sortint,t1decimal(18,6),t2decimal(18,6),t3decimal(18,6))
update#ksetT3=(selectsum(t1-t2)from#kbwhereb.code=#k.codeandb.sort#k.sort-10)
上面的语句执行没问题,但执行下列语句会报错:在包含外部引用的被聚合表达式中指定了多个列。如果被聚合的表达式包含外部引用,那么该外部引用就必须是该表达式中所引用的唯一的一列。

update#ksetT3=(selectsum(t1-#k.t2)from#kbwhereb.code=#k.codeandb.sort#k.sort-10)

请问在子查询引用外层查询的列该怎么写?
回复

使用道具 举报

7

主题

531

帖子

1089

积分

金牌会员

Rank: 6Rank: 6

积分
1089
发表于 2019-7-18 18:05:23 | 显示全部楼层

  1. updatea
  2. seta.T3=(selectsum(b.t1-a.t2)
  3. from#kb
  4. whereb.code=a.codeandb.sorta.sort-10)
  5. from#ka
复制代码
回复

使用道具 举报

0

主题

202

帖子

420

积分

中级会员

Rank: 3Rank: 3

积分
420
发表于 2019-7-18 18:17:33 | 显示全部楼层
先下面的SELECT看看对不对,如果对的,再用后面的UPDATE试试


  1. SELECTSUM(A.T1-B.T2)ASTOTAL
  2. FROM#KA
  3. OUTERAPPLY(SELECTT2FROM#KWHEREA.CODE=CODEANDSORTA.SORT-10)ASB
  4. GROUPBYA.CODE

  5. UPDATE#K
  6. SETT3=A.TOTAL
  7. FROM
  8. (SELECTSUM(A.T1-B.T2)ASTOTAL
  9. FROM#KA
  10. OUTERAPPLY(SELECTT2FROM#KWHEREA.CODE=CODEANDSORTA.SORT-10)ASB
  11. GROUPBYA.CODE)ASA
  12. JOIN#KBONA.CODE=B.CODE
复制代码
回复

使用道具 举报

2

主题

4

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2019-7-18 18:25:11 | 显示全部楼层
上面2种都不行,会报错.
updatea
seta.T3=(selectsum(b.t1-a.t2)
from#kb
whereb.code=a.codeandb.sorta.sort-10)
from#ka
报错:在包含外部引用的被聚合表达式中指定了多个列。如果被聚合的表达式包含外部引用,那么该外部引用就必须是该表达式中所引用的唯一的一列。

UPDATE#K
SETT3=A.TOTAL
FROM
(SELECTSUM(A.T1-B.T2)ASTOTAL
FROM#KA
OUTERAPPLY(SELECTT2FROM#KWHEREA.CODE=CODEANDSORTA.SORT-10)ASB
GROUPBYA.CODE)ASA
JOIN#KBONA.CODE=B.CODE
报错:列名'CODE'无效。
回复

使用道具 举报

0

主题

202

帖子

420

积分

中级会员

Rank: 3Rank: 3

积分
420
发表于 2019-7-18 18:43:51 | 显示全部楼层
引用3楼TIGER0579的回复:上面2种都不行,会报错.
updatea
seta.T3=(selectsum(b.t1-a.t2)
from#kb
whereb.code=a.codeandb.sorta.sort-10)
from#ka
报错:在包含外部引用的被聚合表达式中指定了多个列。如果被聚合的表达式包含外部引用,那么该外部引用就必须是该表达式中所引用的唯一的一列。

UPDATE#K
SETT3=A.TOTAL
FROM
(SELECTSUM(A.T1-B.T2)ASTOTAL
FROM#KA
OUTERAPPLY(SELECTT2FROM#KWHEREA.CODE=CODEANDSORTA.SORT-10)ASB
GROUPBYA.CODE)ASA
JOIN#KBONA.CODE=B.CODE
报错:列名'CODE'无效。


  1. SELECTSUM(A.T1-B.T2)ASTOTAL,A.CODE
  2. FROM#KA
  3. OUTERAPPLY(SELECTT2FROM#KWHEREA.CODE=CODEANDSORTA.SORT-10)ASB
  4. GROUPBYA.CODE

  5. UPDATE#K
  6. SETT3=A.TOTAL
  7. FROM
  8. (SELECTSUM(A.T1-B.T2)ASTOTAL,A.CODE
  9. FROM#KA
  10. OUTERAPPLY(SELECTT2FROM#KWHEREA.CODE=CODEANDSORTA.SORT-10)ASB
  11. GROUPBYA.CODE)ASA
  12. JOIN#KBONA.CODE=B.CODE
复制代码
回复

使用道具 举报

7

主题

531

帖子

1089

积分

金牌会员

Rank: 6Rank: 6

积分
1089
发表于 2019-7-19 10:38:09 | 显示全部楼层

  1. updatea
  2. seta.T3=(selectsum(b.t1)-a.t2
  3. from#kb
  4. whereb.code=a.codeandb.sorta.sort-10)
  5. from#ka
复制代码
回复

使用道具 举报

2

主题

4

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2019-7-19 15:42:56 | 显示全部楼层
上面2种算法结果不对,我想要的是求和(前10条的t1-本条的t2),而不是前10条先求和,再减本条的t2,附上用游标的算法,哪位高人帮我改成子查询的算法,谢谢!
ifobject_id('tempdb.dbo.#k')isnotnulldroptable#k
CREATETABLE#k(codevarchar(6),sortint,t1decimal(18,6),t2decimal(18,6),t3decimal(18,6))
--生成测试数据
declare@iintset@i=1while@i@sort-10)wheresort=@sort
FETCHNEXTFROMauINTO@sort,@t2
END
CLOSEauDEALLOCATEau
select*from#k
回复

使用道具 举报

7

主题

531

帖子

1089

积分

金牌会员

Rank: 6Rank: 6

积分
1089
发表于 2019-7-19 16:09:23 | 显示全部楼层

  1. updatea
  2. seta.T3=c.t3
  3. from#ka
  4. crossapply(selectt3=sum(b.t1)-a.t2*(selectcount(1)
  5. from#kb
  6. whereb.code=a.codeandb.sorta.sort-10)
  7. from#kb
  8. whereb.code=a.codeandb.sorta.sort-10)c


  9. select*from#k

  10. /*
  11. codesortt1t2t3
  12. --------------------------------------------------------------------------------------------------------------------------------------
  13. a1101.00000099.0000002.000000
  14. a2102.00000098.0000007.000000
  15. a3103.00000097.00000015.000000
  16. a4104.00000096.00000026.000000
  17. a5105.00000095.00000040.000000
  18. a6106.00000094.00000057.000000
  19. a7107.00000093.00000077.000000
  20. a8108.00000092.000000100.000000
  21. a9109.00000091.000000126.000000
  22. a10110.00000090.000000155.000000

  23. (10行受影响)
  24. */
复制代码
回复

使用道具 举报

0

主题

202

帖子

420

积分

中级会员

Rank: 3Rank: 3

积分
420
发表于 2019-7-19 22:36:16 | 显示全部楼层
引用4楼RINK_1的回复:Quote: 引用3楼TIGER0579的回复:
上面2种都不行,会报错.
updatea
seta.T3=(selectsum(b.t1-a.t2)
from#kb
whereb.code=a.codeandb.sorta.sort-10)
from#ka
报错:在包含外部引用的被聚合表达式中指定了多个列。如果被聚合的表达式包含外部引用,那么该外部引用就必须是该表达式中所引用的唯一的一列。

UPDATE#K
SETT3=A.TOTAL
FROM
(SELECTSUM(A.T1-B.T2)ASTOTAL
FROM#KA
OUTERAPPLY(SELECTT2FROM#KWHEREA.CODE=CODEANDSORTA.SORT-10)ASB
GROUPBYA.CODE)ASA
JOIN#KBONA.CODE=B.CODE
报错:列名'CODE'无效。


  1. SELECTSUM(A.T1-B.T2)ASTOTAL,A.CODE
  2. FROM#KA
  3. OUTERAPPLY(SELECTT2FROM#KWHEREA.CODE=CODEANDSORTA.SORT-10)ASB
  4. GROUPBYA.CODE

  5. UPDATE#K
  6. SETT3=A.TOTAL
  7. FROM
  8. (SELECTSUM(A.T1-B.T2)ASTOTAL,A.CODE
  9. FROM#KA
  10. OUTERAPPLY(SELECTT2FROM#KWHEREA.CODE=CODEANDSORTA.SORT-10)ASB
  11. GROUPBYA.CODE)ASA
  12. JOIN#KBONA.CODE=B.CODE
复制代码



如果CODE+SORT相当于联合主键,就再试试下面的。


  1. SELECTA.*,B.*
  2. FROM#KA
  3. JOIN
  4. (SELECTA.code,A.sort,SUM(B.t1-A.T2)ASTOTALFROM#KA
  5. OUTERAPPLY(SELECTT1FROM#KWHEREA.CODE=CODEANDSORTA.SORT-10)ASB
  6. GROUPBYA.code,A.sort)ASBONA.code=B.codeANDA.sort=B.sort

  7. UPDATE#k
  8. SETt3=B.TOTAL
  9. FROM#KA
  10. JOIN
  11. (SELECTA.code,A.sort,SUM(B.t1-A.T2)ASTOTALFROM#KA
  12. OUTERAPPLY(SELECTT1FROM#KWHEREA.CODE=CODEANDSORTA.SORT-10)ASB
  13. GROUPBYA.code,A.sort)ASBONA.code=B.codeANDA.sort=B.sort

复制代码
回复

使用道具 举报

1

主题

8

帖子

21

积分

新手上路

Rank: 1

积分
21
发表于 2019-7-20 18:15:56 | 显示全部楼层
仔细考虑了一下,你这个语句确实有问题,因为在这个子查询selectsum(b.t1-a.t2)
from#kb
whereb.code=a.codeandb.sorta.sort-10
中,b选出的的行可能有多行,而a.t2只有一行,多行对一行,是无法进行对应的相减的,所以应该改成这样:

updatea
setT3=(
selectsum(b.t1-c.t2)from#kbleftjoin#kcon
b.code=a.codeandb.sort=a.sort--这两个字段必须能形成联合主键,否则,需要其它能做为主键的条件b.主键=c.主键
whereb.code=a.codeandb.sorta.sort-10
)
from#ka
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|mysql5.com Inc. ( 闽ICP备17002856号-1 )

GMT+8, 2019-12-8 06:09 , Processed in 0.056320 second(s), 18 queries .

Powered by MySQL5.com X3.4

© 2003-2019 MySQL5.com.

快速回复 返回顶部 返回列表