2016-06-29 5 views
-2

У меня есть таблица с 50 столбцами, позволяет нам сказать a,b,c,d т.д.Sql столбец Обновления от обновления столбца в одном операторе

Я хочу обновить б от а и с от нового значения б , так b=b+a,c=c+b ,d = c+ d,.. и т.д. Я не хочу делать обновление, например Update [table] set b=b+a, c= c+b+a.. и т. Д. , потому что для каждого обновления столбца я должен написать огромную вычисленную формулу, которая будет больше и сложнее для каждого столбца.

Таблица, которую я хочу обновить, содержит около 50 миллионов строк, поэтому я считаю, что создание нескольких операторов обновления будет результатом самоубийства.

Как я должен справиться с этим? Считаете ли вы, что использование переменных - хорошая идея?

Спасибо и извините за мой английский.

Примечание: Извините за то, что я не знаю о своем вопросе. В существующей таблице есть 50 новых столбцов. Первый новый столбец a вычисляется с использованием соединения с другими таблицами. Второй новый столбец b вычисляется путем добавления результата к новому значению a к вычислению, которое я хочу сделать, используя соединение с другими таблицами (те же таблицы, что и первое обновление). Логика sames применяется для вычисления значений для всех 50 столбцов.

+0

вы вопрос непонятный. –

+0

Вы должны были нормализовать таблицу, эти значения относятся к другой таблице, связанной с этим. Тогда обновление и формула будут проще. –

+0

Итак, как мы узнаем, какие столбцы должны сгенерировать значение для другого столбца? Есть ли связь, которая может быть получена из имени столбца? что-то вроде column1, column2? В противном случае, как мы можем написать динамический запрос или любой другой запрос для обновления каждого столбца из набора других столбцов, которые продолжают увеличиваться? – Sam

ответ

0

ОБНОВЛЕНО: Благодарим Вас за обновление вопрос. Определенно, используйте SUBQUERIES в своем заявлении UPDATE, чтобы выполнить большую часть работы. Вы можете использовать indexes в своих запросах через SARG s в вашем ON/WHEREpredicates.

С вашей логики самостоятельно зависит от других таблиц для столбцов, что-то вроде следующего поможет:

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 колонны, как я держал внутренний subqueryID в списке. SQL идет справа налево (сначала внутренние запросы), поэтому имейте это в виду.

Это может быть длинная серия объединений, но по крайней мере большая часть повторяющейся логики будет обрабатываться внутри самих подзапросов. OUTER JOINS имеют смысл, так как вы хотите сохранить значение внутреннего запроса и сравнить это новое вычисленное значение со следующим внешним subquery.

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 
Смежные вопросы