2016-10-10 43 views
0

我有一個表中的SQL,我想更新更新值

NAME DATE  Tenor Value 
Item1 2016/01/01 1  0.1 
Item1 2016/01/01 2  0.15 
Item1 2016/01/01 3  0.16 
Item1 2016/01/02 1  0.17 
Item1 2016/01/02 2  0.18 
Item1 2016/01/02 3  0.19 
Item2 2016/01/01 1  0.11 

我想對「2016年1月2日」,「項目1」更新值,與值每個男高音的「2016/01/01」。例如。

對於2016年1月2日和男高音1,用2016年1月1日和男高音1.

對於2016年1月2日和男高音2,更新與2016的值的值更新/ 01/01和中音2.

有沒有簡單的方法,以便我可以改變我的表,而不需要硬編碼的男高音?我有一個有很多選項的巨大桌子。但男高音在日期上是一樣的,我會硬編碼日期和名字。

在此先感謝

+3

您正在使用什麼RDBMS?請正確標記您的問題。 –

+0

'UPDATE tablename SET date = ... WHERE ...' – jarlh

+0

@FelixPamittan,對不起,我只知道SQL的基礎知識,我有Microsoft SQL Management Studio,所以我不知道它是否是sql-server – arodrisa

回答

3

您需要使用SELF JOIN

UPDATE a 
SET a.Value = b.Value 
FROM yourtable a 
     JOIN yourtable b 
     ON a.NAME = b.NAME 
      AND a.Tenor = b.Tenor 
      AND a.DATE = Dateadd(dd, 1, b.DATE) 
+0

這是否適用於同一張表? – arodrisa

+0

是的,它將工作在同一張桌子上。備份您的表格數據並運行上面的'update'語句並檢查 –

+0

讓我試試 – arodrisa

1

使用子選擇的優點,你會得到一個錯誤,如果有返回不止一個值。隨着註冊更新這可能會導致意想不到的結果......

CREATE TABLE tbl (NAME VARCHAR(100),[DATE] DATE,Tenor INT,Value DECIMAL(4,2)); 
INSERT INTO tbl VALUES 
('Item1',{d'2016-01-01'},1,0.1) 
,('Item1',{d'2016-01-01'},2,0.15) 
,('Item1',{d'2016-01-01'},3,0.16) 
,('Item1',{d'2016-01-02'},1,0.17) 
,('Item1',{d'2016-01-02'},2,0.18) 
,('Item1',{d'2016-01-02'},3,0.19) 
,('Item2',{d'2016-01-01'},1,0.11); 

SELECT * FROM tbl; 

UPDATE tbl SET Value=(SELECT tbl2.Value 
         FROM tbl AS tbl2 
         WHERE tbl2.NAME=tbl.NAME 
         AND tbl2.Tenor=tbl.Tenor 
         AND tbl2.[DATE]={d'2016-01-01'}) 
WHERE [DATE]={d'2016-01-02'}; 

SELECT * FROM tbl; 
+0

感謝您的提示 – arodrisa