我有以下两个表:
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; =或者当子查询用作表达式时。 声明已经终止。
我在做什么?我做错了什么蠢事吗?
我应该分组吗? 如果是,那怎么办?
非常感谢任何帮助。 提前谢谢!
答案 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