从同一SQL表中的表更新值

从同一SQL表中的表更新值,sql,sql-server,Sql,Sql Server,我有一个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 Item

我有一个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/01/02”中“项目1”的值,每个期限的值为“2016/01/01”。比如说

对于2016/01/02和期限1,更新为2016/01/01和期限1

对于2016/01/02和期限2,更新为2016/01/01和期限2

有没有一个简单的方法,让我可以改变我的表没有硬编码的男高音?我有一张很大的桌子,有很多选择。但是日期的期限是相同的,我将硬编码日期和名称


提前感谢

您需要使用
自动加入

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) 

您需要使用
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) 

使用子选择的优点是,如果返回的值不止一个,就会出现错误。对于已加入的更新,这可能会导致意外的结果

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;

使用子选择的优点是,如果返回的值不止一个,就会出现错误。对于已加入的更新,这可能会导致意外的结果

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;


您正在使用什么RDBMS?请正确标记您的问题。
updatetablename SET date=。。。WHERE…
@FelixPamittan,对不起,我只知道SQL的基本知识,我有Microsoft SQL Management Studio,所以我不知道它是否是SQL-server@jarlh,我知道,但如何选择这些日期的所有期限?我想更新值,而不是日期您使用的是什么RDBMS?请正确标记您的问题。
updatetablename SET date=。。。WHERE…
@FelixPamittan,对不起,我只知道SQL的基本知识,我有Microsoft SQL Management Studio,所以我不知道它是否是SQL-server@jarlh,我知道,但如何选择这些日期的所有期限?我想更新值,而不是datesyep,它对同一个表有效。备份您的表数据,运行上面的
update
语句,然后选中“让我做一次尝试”。它成功了,我只更改了日期,我设置了a.DATE='02',b.DATE='01'这需要一个1:1的关系。。。否则这将导致意外的(几乎随机的)结果…@Shnugo-如果它是
1:N
关系,那么我们可以使用
行数
或多种可用技术中的一种来更新正确的数据。注意,示例数据看起来是1:1关系,它将适用于同一个表。备份您的表数据,运行上面的
update
语句,然后选中“让我做一次尝试”。它成功了,我只更改了日期,我设置了a.DATE='02',b.DATE='01'这需要一个1:1的关系。。。否则这将导致意外的(几乎随机的)结果…@Shnugo-如果它是
1:N
关系,那么我们可以使用
行数
或多种可用技术中的一种来更新正确的数据。注意:示例数据看起来是tipThanks的1:1关系tipThanks