单个语句

时间:2016-06-29 07:33:43

标签: sql sql-server tsql sql-update

我有一个包含50列的表格,让我们说a,b,c,d等。

我想从a的新值b中更新a和c ,所以 b=b+a,c=c+b ,d = c+ d,..等 我不想做类似的更新 Update [table] set b=b+a, c= c+b+a..等 因为对于每个列更新,我必须编写一个巨大的计算公式,每个列都会变得更大,更复杂。

我想要更新的表有大约5000万行,所以我认为创建多个更新语句将是一种明智的自杀表现。

我应该如何处理? 你认为使用变量是一个好主意吗?

谢谢你,对不起我的英语。

注意:很抱歉没有清楚我的问题。 现有表中有50个新列。 第一个新列a是使用与其他表的连接计算的。 第二个新列b是通过将结果添加到a的新值来计算的,我希望使用与其他表的连接(与第一次更新相同的表)进行计算。 相同的逻辑适用于计算所有50列的值。

2 个答案:

答案 0 :(得分:0)

你可以尝试使用像这样的选择更新。

    UPDATE T
    SET a = T.a
        ,b = T.b
        ,c = T.c
        ,d = T.d
        ...
        ...
    SELECT a
        ,b = b + a
        ,c = c + b
        ,d = d + c
        ...
        ...
FROM yourtable T

答案 1 :(得分:0)

<强>更新: 感谢您更新您的问题。当然,在SUBQUERIES语句中使用UPDATE来完成大部分工作。您可以通过indexes / SARG ON中的WHERE在查询中使用predicates

由于您的逻辑自行依赖于列的其他表,因此以下内容将有所帮助:

CREATE TABLE #TABLE1 (ColA INT, ID INT IDENTITY(1,1) )
INSERT INTO #TABLE1 (ColA ) VALUES (1)
CREATE TABLE #TABLE2 (ColB INT, ID INT IDENTITY(1,1)  )
INSERT INTO #TABLE2 (ColB) VALUES (4)
CREATE TABLE #TABLE3 (ColC INT, ID INT IDENTITY(1,1)  )
INSERT INTO #TABLE3 (ColC) VALUES (10)

SELECT ColC + B.ColB AS ColC, ColC, B.ColB, B.ColA, B.ORIGINAL, B.ID
FROM    #TABLE3 A
        RIGHT OUTER JOIN (SELECT ColB + B.ColA AS ColB, ColA, ORIGINAL, B.ID
                            FROM    #TABLE2 A
                            RIGHT OUTER JOIN (SELECT ColA + ColB AS ColA, ColB AS ORIGINAL, A.ID
                                            FROM #TABLE1 A
                                            INNER JOIN #TABLE2 B ON A.ID = B.ID) B ON A.ID = B.ID ) B ON A.ID = B.ID

请注意,为简单起见,我只假设这些表具有相同的ID列,因为我在列表中保留了内部subquery IDSQL从右向左(首先是内部查询),所以请记住这一点。

这可能是一系列连接,但至少大多数重复逻辑都是子查询本身内部的句柄。 OUTER JOINS有意义,因为您希望保留内部查询的值,并将该新计算值与下一个外部subquery进行比较。