我希望有人可以帮助我。
我试着更新了我的桌子
我来自#TempTable1
:
DATE NO_CDE NO_OF variable1 FLAG LINE
---------------------------------------------------------------------------
2017-05-23 1 10 0 E 1
2017-05-23 2 20 0 E 1
2017-05-22 1 10 0 E 1
2017-05-22 2 20 0 E 1
2017-05-19 1 10 0 E 1
2017-05-19 2 20 0 E 1
2017-05-18 1 10 0 E 1
2017-05-18 2 20 0 E 1
2017-05-17 1 10 0 E 1
2017-05-17 2 20 0 E 1
2017-05-16 1 10 0 E 1
2017-05-16 2 20 0 E 1
2017-05-15 1 NULL 19 E 1
2017-05-15 2 NULL 13 E 1
2017-05-12 1 NULL 16 E 1
2017-05-12 2 NULL 10 E 1
2017-05-11 1 NULL 15 E 1
2017-05-11 2 NULL 9 E 1
2017-05-10 1 NULL 14 E 1
2017-05-10 2 NULL 8 E 1
我想要的表#TempTable1
:
DATE NO_CDE NO_OF variable1 FLAG LINE
---------------------------------------------------------------------------
2017-05-23 1 10 19 E 1
2017-05-23 2 20 13 E 1
2017-05-22 1 10 19 E 1
2017-05-22 2 20 13 E 1
2017-05-19 1 10 19 E 1
2017-05-19 2 20 13 E 1
2017-05-18 1 10 19 E 1
2017-05-18 2 20 13 E 1
2017-05-17 1 10 19 E 1
2017-05-17 2 20 13 E 1
2017-05-16 1 10 19 E 1
2017-05-16 2 20 13 E 1
2017-05-15 1 NULL 19 E 1
2017-05-15 2 NULL 13 E 1
2017-05-12 1 NULL 16 E 1
2017-05-12 2 NULL 10 E 1
2017-05-11 1 NULL 15 E 1
2017-05-11 2 NULL 9 E 1
2017-05-10 1 NULL 14 E 1
2017-05-10 2 NULL 8 E 1
案例是:
如果no_OF不为null,则从具有相同CDE且NO_OF = null的行中获取最大值
如果flag是<>来自' E',从具有相同CDE和NO_OF = null的行中获取最大值
如果no_of为null且flag =' E'然后将值保存在variable1
中
我尝试的是:
UPDATE #TempTable1
SET variable1 =
CASE
WHEN NO_OF IS NULL and FLAG = 'E'
THEN variable1
ELSE( select max(table1.variable1)
from #TempTable1 table1
Left JOIN #TempTable1 table2
ON table1.NO_CDE = table2.NO_CDE
AND table1.LINE = table2.LINE
and table1.NO_OF = table2.NO_OF
where table1.FLAG = 'E'
and table1.NO_OF is null
)
END;
这里是要在表中创建和插入的DLL
if OBJECT_ID('tempdb..#TempTable1') is not null
Drop table #TempTable1;
create table #TempTable1 (
DATE datetime not null,
NO_CDE int not null,
NO_OF int,
variable1 int not null,
FLAG char not null,
LINE smallint not null
);
insert into #TempTable1
values (2017-05-23, 1, 10, 0, 'E', 1),
(2017-05-23, 2, 20, 0, 'E', 1),
(2017-05-22, 1, 10, 0, 'E', 1),
(2017-05-22, 2, 20, 0, 'E', 1),
(2017-05-19, 1, 10, 0, 'E', 1),
(2017-05-19, 2, 20, 0, 'E', 1),
(2017-05-18, 1, 10, 0, 'E', 1),
(2017-05-18, 2, 20, 0, 'E', 1),
(2017-05-17, 1, 10, 0, 'E', 1),
(2017-05-17, 2, 20, 0, 'E', 1),
(2017-05-16, 1, 10, 0, 'E', 1),
(2017-05-16, 2, 20, 0, 'E', 1),
(2017-05-15, 1, NULL, 19, 'E', 1),
(2017-05-15, 2, NULL, 13, 'E', 1),
(2017-05-12, 1, NULL, 16, 'E', 1),
(2017-05-12, 2, NULL, 10, 'E', 1),
(2017-05-11, 1, NULL, 15, 'E', 1),
(2017-05-11, 2, NULL, 9, 'E', 1),
(2017-05-10, 1, NULL, 14, 'E', 1),
(2017-05-10, 2, NULL, 8, 'E', 1);
答案 0 :(得分:0)
您的问题是因为更新语句中的子查询没有绑定到您指定要更新的表。
您应该在TSQL的更新语句中使用FROM子句,将最大值加回到您要更新的表中,并指定要更新的表。
UPDATE Base
SET variable1 =
CASE
WHEN Base.NO_OF IS NULL and Base.FLAG = 'E'
THEN variable1
ELSE MaxVariableForCDE.MaxVariable1
END
FROM
#TempTable1 as Base
INNER JOIN (
select
table1.NO_CDE,
table1.FLAG,
table1.LINE,
max(table1.variable1) as MaxVariable1
from #TempTable1 table1
where table1.FLAG = 'E'
and table1.NO_OF is null
GROUP BY
table1.NO_CDE,
table1.FLAG,
table1.LINE) as MaxVariableForCDE ON
Base.NO_CDE = MaxVariableForCDE.NO_CDE
AND Base.FLAG = MaxVariableForCDE.FLAG
AND Base.LINE = MaxVariableForCDE.LINE