Обновите каждую строку таблицы данными из самой таблицы - PullRequest
0 голосов
/ 16 октября 2018

У меня проблема с обновлением рабочей таблицы - значения из этой таблицы берутся из самой таблицы.Вот моя таблица:

+----------+----------+-----+---------+
| EVEN_KEY | INVE_KEY | QUA | QUA_MAX |
+----------+----------+-----+---------+
|        1 |        2 |   1 | NULL    |
|        2 |        2 |   2 | NULL    |
|        3 |        2 |   3 | NULL    |
|        1 |        1 |   2 | NULL    |
|        4 |        2 |   3 | NULL    |
+----------+----------+-----+---------+

Я хотел бы обновить столбец qua_max - суммировать столбец qua для данного inve_key для каждой строки.Итак, результаты в приведенной выше таблице должны выглядеть после обновления:

+----------+----------+-----+---------+
| EVEN_KEY | INVE_KEY | QUA | QUA_MAX |
+----------+----------+-----+---------+
|        1 |        2 |   1 | 9       |
|        2 |        2 |   2 | 9       |
|        3 |        2 |   3 | 9       |
|        1 |        1 |   2 | 1       |
|        4 |        2 |   3 | 9       |
+----------+----------+-----+---------+

И вот моя проблема - запрос из этого примера дает мне ошибку, я даже не могу ее запустить.Что не так?

Ошибка:

enter image description here

Запрос:

UPDATE @TEMP_FINAL
    SET QUA_MAX = (SELECT SUM(QUA)
                FROM @TEMP_FINAL t2
                WHERE @TEMP_FINAL.INVE_KEY = t2.INVE_KEY 
                GROUP BY INVE_KEY
               ) 

ТАБЛИЦА ПРИМЕРОВ:

DECLARE @TEMP_FINAL TABLE
(
    EVEN_KEY INT,
    INVE_KEY INT,
    QUA INT,
    QUA_MAX INT
)

insert into @TEMP_FINAL (even_key, inve_key, qua)
values(1, 2, 1), 
(2,2,2),
(3,2,3),
(1,1,2),
(4,2,3)

Ответы [ 4 ]

0 голосов
/ 16 октября 2018

Вы можете попробовать это ..

UPDATE t1
SET t1.QUA_MAX = a.sum_qua
from @temp_final t1,
             (SELECT SUM(QUA) as sum_qua,inve_key
                FROM @TEMP_FINAL t2
                GROUP BY INVE_KEY
               ) a
where t1.INVE_KEY = a.INVE_KEY
0 голосов
/ 16 октября 2018

я думаю, что вы должны добавить temp_final в предложении from, потому что вы делаете неявное самостоятельное соединение, но объявляете просто таблицу как псевдоним t2

0 голосов
/ 16 октября 2018

Итак, вот ваш полный код:

DECLARE @TEMP_FINAL TABLE
(
    EVEN_KEY INT,
    INVE_KEY INT,
    QUA INT,
    QUA_MAX INT
)

insert into @TEMP_FINAL (even_key, inve_key, qua)
values(1, 2, 1), 
(2,2,2),
(3,2,3),
(1,1,2),
(4,2,3)

UPDATE @TEMP_FINAL
    SET QUA_MAX = (SELECT SUM(QUA)
                FROM @TEMP_FINAL t2 
                WHERE @TEMP_FINAL.INVE_KEY = t2.INVE_KEY 
                GROUP BY INVE_KEY
               )

Я не знаю, смотрю ли я на это неправильно, но мне кажется, что вы делаете предложение where, сравнивая ту же самую вещь с самим собой?Но вместо @TEMP_FINAL.INVE_KEY = @TEMP_FINAL.INVE_KEY вы делаете @TEMP_FINAL.INVE_KEY = t2.INVE_KEY.Извините, что поднял этот вопрос. Я просто хотел убедиться, что это было намеренно или нет?

0 голосов
/ 16 октября 2018

Вы ищете оконную функцию

sum(QUA) over (partition by INVE_KEY)

Обратите внимание, что ваши данные выборки для @TEMP_FINAL имеют QUA = 2 для INVE_KEY = 1, что не соответствует исходным данным выборки.

select 
    *, 
    QUA_MAX = sum(QUA) over (partition by INVE_KEY)
from @TEMP_FINAL

И одним из способов его обновления будет коррелированный подзапрос

update t1
set QUA_MAX = (select top 1 sum(QUA) over (partition by INVE_KEY) from @TEMP_FINAL t2 where t2.INVE_KEY = t1.INVE_KEY)
from @TEMP_FINAL t1

select * from @TEMP_FINAL

Или CTE

;with cte as(
select 
        EVEN_KEY,
        INVE_KEY,
        QUA, 
        QUA_MAX = sum(QUA) over (partition by INVE_KEY)
    from @TEMP_FINAL)

update @TEMP_FINAL 
set QUA_MAX = c.QUA_MAX
from cte c
where c.INVE_KEY = [@TEMP_FINAL].INVE_KEY

select * from @TEMP_FINAL
...