【问题标题】:Update using Join and selecting newest value使用 Join 更新并选择最新值
【发布时间】:2017-03-07 10:30:10
【问题描述】:

我有以下两个表:

ALL_Data

id  |  Name      |   DateAsInteger
-------------------------------------
10  |   gazoline |   20151230
20  |   diesel   |   20160101
30  |   accu     |   20151128
30  |   battery  |   20170307

我知道,将日期存储为整数不是最好的主意,但现在不能更改。

PIVOT_Data

id  |  SomeInfo     |  Name         
------------------------------------
10  |   xx          |               
20  |   yy          |               
30  |   zz          |               

我需要用来自ALL_Data 的最新Name 更新PIVOT_Data 表。

结果:

id  |  SomeInfo     |  Name         |   newest value    DateAsInteger in ALL_Data
-------------------------------------                   -------------
10  |   xx          |   gazoline    |       <->         20151230
20  |   yy          |   diesel      |       <->         20160101
30  |   zz          |   battery     |       <->         20170307

我尝试了什么:

UPDATE a
    SET a.Name = b.Name
    FROM PIVOT_Data a 
        join ALL_Data b 
        ON   a.id = b.id
        WHERE b.DateAsInteger = (
            SELECT z1.DateAsInteger
                FROM ALL_Data z1 LEFT JOIN ALL_Data z2
                 ON (z1.id = z2.id AND z1.Ti_DateAsInteger< z2.Ti_DateAsInteger)
    WHERE z2.Ti_DateAsIntegerIS NULL);

错误信息:

消息 512,第 16 级,状态 1,第 1 行 子查询返回超过 1 个值。子查询时不允许这样做 跟随 =、!=、、>= 或当子查询用作表达式时。 声明已终止。

我在做什么?我做错了什么愚蠢的事情吗?

我应该分组吗? 如果是,那么如何?

非常感谢任何帮助。 提前致谢!

【问题讨论】:

    标签: sql sql-server join sql-update


    【解决方案1】:

    试试下面的查询,

    UPDATE  PD
    SET     PD.Name =   (   SELECT  TOP 1 AD.Name
                            FROM    ALL_Data    AS  AD
                            WHERE   AD.id   =   PD.id
                            ORDER BY DateAsInteger DESC
                        )
    FROM    PIVOT_Data  AS  PD
    

    【讨论】:

      【解决方案2】:

      使用MAX条件

      样本数据

      DECLARE @ALL_Data TABLE 
          (id int, Name varchar(8), DateAsInteger int)
      ;
      
      INSERT INTO @ALL_Data
          (id, Name, DateAsInteger)
      VALUES
          (10, 'gazoline', 20151230),
          (20, 'diesel', 20160101),
          (30, 'accu', 20151128),
          (30, 'battery', 20170307)
      ;
      
      Declare @PIVOT_Data TABLE 
          (id int, Info varchar(2),Name varchar(20))
      ;
      
      INSERT INTO @PIVOT_Data
          (id, Info,name)
      VALUES
          (10, 'xx',''),
          (20, 'yy',''),
          (30, 'zz','')
      ;
      

      示例脚本

      ;with CTE AS (Select 
      P.id,
      P.Info,
      MAX(A.DateAsInteger)DateAsInteger 
      from 
          @ALL_Data A
          INNER JOIN @PIVOT_Data P
          ON P.id = A.id
      GROUP BY P.id,P.Info)
      
      
      UPDATE P 
      SET Name = DateAsInteger 
      from CTE 
      C INNER JOIN @PIVOT_Data P 
      ON P.id = C.id 
      
      Select * from @PIVOT_Data
      

      【讨论】:

      • Msg 1087, Level 15, State 2, Line 11 必须声明表变量"@ALL_Data"。我应该创建一个并将所有内容从实际表中插入到 varaibale 中吗?
      • 我只是将表变量用于参考目的,您可以在普通表中使用@Kaptah
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多