从同一SQL表中的表更新值
我有一个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
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