【问题标题】:Query to update all the null values to not null for all the columns in a single or dynamic query查询以将单个或动态查询中所有列的所有空值更新为不为空
【发布时间】: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


【解决方案1】:

试试下面这个脚本-

DEMO HERE

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

【讨论】:

  • 这没有考虑到 OP 要求在 TableC 中有多个值时使用“最新”值
  • 您的更改令人困惑。您是否需要表 C 中每个 ID 的最新日期的值?
  • @mkRabbani 是的,需要基于 id 的最新值,如果最新值具有空值,则应使用下一个非空值进行更新。
猜你喜欢
  • 2013-10-20
  • 2022-08-17
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 2015-10-27
  • 1970-01-01
相关资源
最近更新 更多