首页 > 解决方案 > 查询以将单个或动态查询中所有列的所有空值更新为不为空

问题描述

我正在寻找一个 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

在输出NULL中,表 A 中的所有列值都使用NOT NULL表 C 中的值进行更新。请提供单个查询来更新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 语句的集合列表中。

我需要输出表中的所有值以及使用非空值更新的空值。

标签: sqlsql-servertsql

解决方案


试试下面的脚本 -

在这里演示

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

推荐阅读