【发布时间】:2020-05-06 01:38:29
【问题描述】:
我正在寻找一个 SQL 查询来将表 A 中的所有列更新为表 C 中的 NULL 值到 NOT NULL 值,使用表 B 的引用。表 A 中的所有列都应该使用更新单个查询或动态查询。值应根据列名更新,值不应硬编码。
表 A
ID Name zip city Mdate
10001 Sarah NULL NULL 02-20-2018
98765 AJ NULL Ohio 01-15-2018
12345 NULL 7511 Texas 03-08-2018
表 B
ID RollNo Cdate
12345 1 01-18-2018
12345 2 01-22-2018
12345 3 03-20-2018
98765 9 01-18-2018
98765 8 01-22-2018
98765 7 03-20-2018
10001 10 03-08-2018
10001 11 01-15-2018
10001 12 02-20-2018
表 C
Rollno Name Zip City Mdate Cdate Modifyby
1 NULL 7511 Texas 01-18-2018 02-02-2017 @John
2 John 5001 NULL 01-22-2018 11-01-2017 @Krish
3 NULL 7000 Ohio 03-20-2018 11-15-2017 @Maria
10 Sarah NULL NULL 03-08-2018 10-05-2017 @tom
11 Tom NULL NULL 01-15-2018 04-05-2017 @Sony
12 NULL 5500 Pune 02-20-2018 03-25-2017 @Sandy
9 AJ NULL Ohio 01-18-2018 10-07-2017 @Mandy
8 NULL NULL NULL 01-12-2018 11-02-2017 @Deck
7 NUll 8000 NULL 01-12-2018 12-05-2017 @Ant
输出:
ID Name zip city Mdate Cdate Modifyby
10001 Sarah 5500 Pune 02-20-2018 03-25-2017 @Sandy
98765 AJ 8000 Ohio 01-18-2018 10-07-2017 @Mandy
12345 John 7511 Texas 03-08-2018 10-05-2017 @tom
在输出中,表 A 中的所有 NULL 列值都使用表 C 中的 NOT NULL 值进行更新。请提供单个查询以更新单个查询本身中的所有 NULL 列。
我正在尝试以下查询,但无法使用 max 函数更新表。有没有替代品。
Select * into #temp FROM
(
SELECT A.ID,
Row_number() over(partition by A.ID order by A.mdate desc) as
RNK,C.NAME,C.ZIP,C.CITY,C.MDate,C.Cdate,C.Modifyby
FROM tableA A
INNER JOIN tableB B ON A.ID = B.ID
INNER JOIN tableC C ON B.RollNo = C.RollNo
)X where RNK = 1
UPDATE A SET Name =
CASE
WHEN MAX(A.Name) IS NULL THEN MAX(C.Name)
ELSE Max(A.Name) END
, Zip =
CASE
WHEN MAX(A.Zip) IS NULL THEN Max(C.Zip)
ELSE MAX(A.Zip)
END ,
City =CASE
WHEN MAX(A.City) IS NULL THEN Max(C.City)
ELSE MAX(A.City)
END
FROM #temp A
INNER JOIN TableB B ON A.ID = B.ID
INNER JOIN tablec C ON B.RollNo = C.RollNo
得到一个错误:
聚合可能不会出现在 UPDATE 语句的集合列表中。
我需要输出表中的所有值以及使用非空值更新的空值。
【问题讨论】:
-
为什么
TABLE C中的Rollno 11在应该与Sarah关联的时候有Tom作为名称? -
到目前为止你尝试了什么?
-
表 a 10001 中的值在表 c 中有 3 条子记录,因为最新记录有 sarah,因此无论其他记录如何,它都会被视为最终记录。它也适用于所有列。希望你明白了。
-
将任何澄清/附加信息直接添加到问题edit
-
@dalek 修改需求请检查
标签: sql sql-server tsql