坚持我的SQL更新 - SQL服务器

时间:2017-05-23 14:32:02

标签: sql sql-server

我希望有人可以帮助我。

我试着更新了我的桌子

我来自#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);

1 个答案:

答案 0 :(得分:0)

您的问题是因为更新语句中的子查询没有绑定到您指定要更新的表。

enter image description here

您应该在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