将值插入表的列并更新该列

时间:2015-10-16 12:23:08

标签: sql tsql sql-server-2012

我想将值插入表格的列中,对于插入的每个值,我想复制所有行`wHERE anotherColumn =' someString'

然后我想根据它们的名称(rN)更新插入的行的ID。

表格定义:

myFirstTable

rN      rID   rnk        dateR        value1 value2 calculation1 calculation2 calculation3
abc_3m   3   abc_3mxfx  20.10.2010     1       3      4            3             0.33
abc_6m   4   abc_6mxfx  20.10.2010     2       1      3            8             4

首先,让我们在rN中插入新值。取值rN = abc_6m

的值
insert into #myFirstTable (rN)
values 
('abc_6m'), ('abc_1y'), ('abc_2y'), ('abc_3y'), ('abc_4y'), ('abc_5y'), ('abc_7y'), ('abc_10y'), ('abc_15y'), ('abc_30y')

查询1

update #myFirstTable
set rN = (select * from #myFirstTable
where rN = 'abc_6m')
where rN in (
             'abc_6m', 'abc_1y', 'abc_2y', 'abc_3y', 'abc_4y', 'abc_5y', 'abc_7y', 'abc_10y', 'abc_15y', 'abc_30y'
             )

该表将成为:

#myFirstTable
rN      rID   rnk        dateR        value1 value2 calculation1 calculation2 calculation3
abc_3m   3   abc_3mxfx  20.10.2010     1       3      4            3             0.33
abc_6m   4   abc_6mxfx  20.10.2010     2       1      3            8             4
abc_1y   4   abc_6mxfx  20.10.2010     2       1      3            8             4
abc_2y   4   abc_6mxfx  20.10.2010     2       1      3            8             4

依此类推,插入所有值。

然后我想将rID更新为正确的值,以便列rID如下所示:

rN      rID   rnk        dateR        value1 value2 calculation1 calculation2 calculation3
abc_3m   3   abc_3mxfx  20.10.2010     1       3      4            3             0.33
abc_6m   4   abc_6mxfx  20.10.2010     2       1      3            8             4
abc_1y   5   abc_6mxfx  20.10.2010     2       1      3            8             4
abc_2y   6   abc_6mxfx  20.10.2010     2       1      3            8             4

为了做到这一点,我想写下这样的东西:

查询2

update #myFirstTable
set rID =  (case when rnk = 'abc_1y' then rID = '100', 
            case when rnk = 'abc_2y' then rID = '101'
            case when rnk = 'abc_3y' then rID = '102'
            case when rnk = 'abc_4y' then rID = '103'
            case when rnk = 'abc_5y' then rID = '104'
            case when rnk = 'abc_7y' then rID = '105'
            case when rnk = 'abc_10y' then rID = '106'
            case when rnk = 'abc_15y' then rID = '107'
            case when rnk = 'abc_30y' then rID = '108'
            ) end 


select * from #myFirstTable
where rN = 'abc_6M'

问题:  的 1 即可。我的逻辑是否符合我想要实现的目标? (query1query2语法是否正确?我可以在sql server 2012中编写类似的内容吗?

2 即可。可以这样写一个update column = (case when column = then another column = 'value'吗?

第3 即可。我能以某种方式使用窗口函数以更简单的方式做到这一点吗?

前:

select * from myTable 
case (
when rN not in ('abc_1m', 'abc_3m', 'abc_6m') then 
select * from #myFirstTable where rN like 'abc_6m' 
over (partition by (select * from #myFirstTable where rN like 'abc_6m'))) end 

很抱歉,如果我没有以最明确的方式表达问题,但我不确定我可以使用什么以及如何使用它,这就是我寻找指导的原因。 感谢

1 个答案:

答案 0 :(得分:0)

修改

我只是一个初学者,这是我能想到的最好的,这似乎是你想要做的。以下步骤正在已经存在的表上构建,其中包含两行名为MyFirstTable。

<强> 1。步骤(在rN列中插入其他值):

INSERT INTO MyFirstTable (rN)
VALUES ('abc_1y'),('abc_2y'),('abc_3y'),('abc_4y'),('abc_5y'),('abc_7y'),('abc_10y'),('abc_15y'),('abc_30y');

<强> 2。 step(删除rID列并创建一个具有auto_incremeneted值的新列)

ALTER TABLE MyFirstTable
DROP COLUMN rID;

ALTER TABLE MyFirstTable
ADD rID int IDENTITY(3,1);

更多信息:http://www.w3schools.com/sql/sql_autoincrement.asp

第3。步骤(使用第二行中的值更新其他列中的字段)

这里,更新与名为&#34; self-join&#34;的东西结合在一起,因为FROM子句不允许我们使用与正在更新的嵌套表相同的源表,因此嵌套无法使用查询来检索所需的值。

UPDATE t1
SET 
    t1.rnk = t2.rnk,
    t1.dateR = t2.dateR,
    t1.value1 = t2.value1,
    t1.value2 = t2.value2,
    t1.calculation1 = t2.calculation1,
    t1.calculation2 = t2.calculation2,
    t1.calculation3 = t2.calculation3
FROM MyFirstTable t1
LEFT JOIN MyFirstTable t2 ON t2.rN='abc_6m'
WHERE t1.rN in ('abc_1y','abc_2y','abc_3y','abc_4y','abc_5y','abc_7y','abc_10y','abc_15y','abc_30y');

有关自我加入的更多信息:https://technet.microsoft.com/en-us/library/ms177490%28v=sql.105%29.aspx

我发现这个答案很有帮助:https://stackoverflow.com/a/5574558/4296411

警告:我真的只是一个初学者,可能以上都不是一个好习惯,可能包含导致不可预测结果的错误。 :)它似乎正在回答你的问题。祝好运!

<强> EDIT2:

嗯,这很可能是一种荒谬的矫枉过正,但由于你不能放弃rID专栏,我能够提出这个相当复杂的解决方案。首先,您将执行步骤#1,然后执行步骤#3,然后执行:

DECLARE @i INT = 1;
WHILE @i <= (SELECT COUNT(rN) FROM MyFirstTable WHERE rN IN ('abc_1y','abc_2y','abc_3y','abc_4y','abc_5y','abc_7y','abc_10y','abc_15y','abc_30y')) -- getting number of desired loops based on rows to be affected
BEGIN
   UPDATE MyFirstTable
   SET rID = 4+@i -- using number 4 as a starting point for incrementation and @i variable to perform the actual incrementation
   WHERE 
        rN = ( -- specifying which row should be affected in each loop
            SELECT SUBQUERY.rN
            FROM ( -- assigning temporary row number for each desired row
                SELECT ROW_NUMBER() OVER (ORDER BY value1) as row_num, rN -- using value1 in order to keep the current order (this doesn't seem to be a good practice, but it works)
                FROM MyFirstTable
                WHERE rN IN ('abc_1y','abc_2y','abc_3y','abc_4y','abc_5y','abc_7y','abc_10y','abc_15y','abc_30y')
                ) as SUBQUERY
            WHERE SUBQUERY.row_num = @i
            )
   SET @i = @i + 1;
END;
PS:请不要担心我对你的问题的轻微痴迷。 :D我只是觉得这个问题很有趣,这有助于我进一步教育自己。