使用Join更新并选择最新值

时间:2017-03-07 10:30:11

标签: sql sql-server join sql-update

我有以下两个表:

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          |               

我需要使用PIVOT_Data的最新Name更新ALL_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);

错误讯息:

  

Msg 512,Level 16,State 1,Line 1       子查询返回的值超过1。子查询时不允许这样做       follow =,!=,&lt;,&lt; =,&gt;,&gt; =或者当子查询用作表达式时。       声明已经终止。

我在做什么?我做错了什么蠢事吗?

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

使用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