2017-03-07 30 views
2

我有以下兩個表:更新使用加入和選擇最新的值

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更新PIVOT_Data表最新Name

結果:

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值。當子查詢 跟隨=,!=,<,< =,>,> =或當子查詢用作表達式時,這是不允許的。 該聲明已被終止。

我在做什麼?我在做什麼愚蠢的錯誤?

我應該GROUP BY嗎? 如果是,那麼如何?

任何幫助,高度讚賞。 提前致謝!

回答

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

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

Msg 1087,Level 15,State 2,Line 11 必須聲明表變量'「@ALL_Data」'。我應該創建一個並從實際表格中將所有內容插入到varaibale中嗎? – Kaptah

+0

我只是使用表變量作爲參考目的,您可以在普通表中使用@Kaptah – mohan111