我想将值插入表格的列中,对于插入的每个值,我想复制所有行`wHERE anotherColumn =' someString'
然后我想根据它们的名称(rN
)更新插入的行的ID。
表格定义:
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')
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
为了做到这一点,我想写下这样的东西:
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 即可。我的逻辑是否符合我想要实现的目标? (query1
和query2
语法是否正确?我可以在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
很抱歉,如果我没有以最明确的方式表达问题,但我不确定我可以使用什么以及如何使用它,这就是我寻找指导的原因。 感谢
答案 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我只是觉得这个问题很有趣,这有助于我进一步教育自己。