Sql 查询以将单个或动态查询中所有列的所有空值更新为NOTNULL

Sql 查询以将单个或动态查询中所有列的所有空值更新为NOTNULL,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在寻找一个SQL查询来更新表a中的所有列,其中表C中的NULL值为notnull值,并使用表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

我正在寻找一个SQL查询来更新表a中的所有列,其中表C中的
NULL
值为
notnull
值,并使用表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语句的集合列表中

我需要输出表中的所有值以及用not null值更新的null值。

尝试下面的脚本-


为什么
表C
中的
Rollno 11
在应该与
Sarah
关联时将
Tom
作为名称?到目前为止您尝试了什么?表a 10001中的值在表C中有3个子记录,因为最新的记录有Sarah,所以它将被视为最终记录,而不考虑其他记录。它也适用于所有列。希望您能理解。请直接在问题中添加任何澄清/附加信息@dalek修改了要求。请检查这没有考虑OPs要求,在表中有多个值的情况下使用“最新”值。您的更改令人困惑。对于每个id的最新日期,是否需要表C中的值?@mkRabbani yes需要基于id的最新值,如果最新值具有空值,则应使用下一个非空值进行更新。
SELECT A.ID,
CASE 
    WHEN MAX(A.Name) IS NULL THEN MAX(C.Name) 
    ELSE Max(A.Name) 
END Name,
CASE
    WHEN MAX(A.Zip) IS NULL THEN Max(C.Zip)
    ELSE MAX(A.Zip)
END Zip,
CASE 
    WHEN MAX(A.City) IS NULL THEN Max(C.City) 
    ELSE MAX(A.City) 
END City,
A.MDate
FROM table_a A
INNER JOIN Table_B B ON A.ID = B.ID
INNER JOIN table_c C ON B.RollNo = C.RollNo
GROUP BY A.ID,A.MDate