这个问题说来惭愧,我以前遇到这样一个问题:
更新表A时,需要用到表A自身且字段也是同一字段,如何区分呢?
还有更新一个表变量@tb时,我们需要给表变量的某一字段指定所属表,但是我们显然不能使用@tb,这时怎么办呢?
一直以来用到都是比较笨的办法,直到无意间发现Update也可用别名。
这也让我一下明白了,sql的解析是从From开始的。
1 DECLARE @tb TABLE
2 (
3 OID INT,
4 vName NVARCHAR(50),
5 dcQty DECIMAL(15, 2)
6 )
7
8 INSERT INTO @tb ( OID, vName, dcQty )
9 VALUES ( /* OID - INT */ 1,
10 /* vName - NVARCHAR(50) */ N'aa',
11 /* dcQty - DECIMAL(15, 2) */ 2 )
12
13 INSERT INTO @tb ( OID, vName, dcQty )
14 VALUES ( /* OID - INT */ 2,
15 /* vName - NVARCHAR(50) */ N'bb',
16 /* dcQty - DECIMAL(15, 2) */ 4 )
17
18 INSERT INTO @tb ( OID, vName, dcQty )
19 VALUES ( /* OID - INT */ 2,
20 /* vName - NVARCHAR(50) */ N'bb',
21 /* dcQty - DECIMAL(15, 2) */ 3 )
22
23 INSERT INTO @tb ( OID, vName, dcQty )
24 VALUES ( /* OID - INT */ 3,
25 /* vName - NVARCHAR(50) */ N'cc',
26 /* dcQty - DECIMAL(15, 2) */ 6 )
27
28 UPDATE T1
29 SET T1.dcQty = T2.dcQty
30 FROM @tb AS T1
31 JOIN ( SELECT OID,
32 SUM(dcQty) AS dcQty
33 FROM @tb
34 GROUP BY OID
35 ) AS T2 ON T1.OID = T2.OID
36
37 SELECT *
38 FROM @tb
39
2 (
3 OID INT,
4 vName NVARCHAR(50),
5 dcQty DECIMAL(15, 2)
6 )
7
8 INSERT INTO @tb ( OID, vName, dcQty )
9 VALUES ( /* OID - INT */ 1,
10 /* vName - NVARCHAR(50) */ N'aa',
11 /* dcQty - DECIMAL(15, 2) */ 2 )
12
13 INSERT INTO @tb ( OID, vName, dcQty )
14 VALUES ( /* OID - INT */ 2,
15 /* vName - NVARCHAR(50) */ N'bb',
16 /* dcQty - DECIMAL(15, 2) */ 4 )
17
18 INSERT INTO @tb ( OID, vName, dcQty )
19 VALUES ( /* OID - INT */ 2,
20 /* vName - NVARCHAR(50) */ N'bb',
21 /* dcQty - DECIMAL(15, 2) */ 3 )
22
23 INSERT INTO @tb ( OID, vName, dcQty )
24 VALUES ( /* OID - INT */ 3,
25 /* vName - NVARCHAR(50) */ N'cc',
26 /* dcQty - DECIMAL(15, 2) */ 6 )
27
28 UPDATE T1
29 SET T1.dcQty = T2.dcQty
30 FROM @tb AS T1
31 JOIN ( SELECT OID,
32 SUM(dcQty) AS dcQty
33 FROM @tb
34 GROUP BY OID
35 ) AS T2 ON T1.OID = T2.OID
36
37 SELECT *
38 FROM @tb
39
分类:
SQL Server
, 使用技巧
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?