Существует функция в операторе обновления MS SQL Server - PullRequest
0 голосов
/ 27 августа 2018

Я получил 2 таблицы:

table0: (id,attr0,attr1)

table1: (id,attr0,attr1)

Мне нужно обновить table0 значениями table1, где t0.id = t1.id, используя функцию exists ( избежать функции соединения ). Я пробовал что-то вроде этого:

UPDATE table0
SET
    attr0   = trn.attr0,
    attr1   = trn.attr1
FROM( 
    SELECT id, max(transaction_date) as attr0,
    max(CASE 
            WHEN transaction_code in ('a', 'b', 'c')
            THEN transaction_date  
            ELSE NULL 
        END) as attr1
    FROM table1
    GROUP BY id) trn
WHERE exists (SELECT * FROM table1 WHERE table0.id = trn.id);

Но этот запрос обновляет все строки в table0, и я не понимаю, почему. Плз, подскажите, почему это работает не так?

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Пожалуйста, попробуйте ниже

UPDATE t0
SET
    attr0   = trn.attr0,
    attr1   = trn.attr1
FROM table0 t0 join( 
    SELECT id, max(transaction_date) as attr0,
    max(CASE 
            WHEN transaction_code in ('a', 'b', 'c')
            THEN transaction_date  
            ELSE NULL 
        END) as attr1
    FROM table1
    GROUP BY id)trn on trn.id=t0.id

Спасибо

0 голосов
/ 27 августа 2018

Используя Inner join, вы можете обновить данные. как показано ниже.

UPDATE t
SET
    t.attr0   = trn.attr0,
    t.attr1   = trn.attr1
FROM( 
    SELECT id, max(transaction_date) as attr0,
    max(CASE 
            WHEN transaction_code in ('a', 'b', 'c')
            THEN transaction_date  
            ELSE NULL 
        END) as attr1
    FROM table1
    GROUP BY id) trn
INNER JOIN table0 t ON t.id=trn.id
0 голосов
/ 27 августа 2018

Вы можете использовать это? Это обновит только идентификаторы из таблицы 1

with cte as (
SELECT id, max(transaction_date) as attr0,
max(CASE 
        WHEN transaction_code in ('a', 'b', 'c')
        THEN transaction_date  
        ELSE NULL 
    END) as attr1
    FROM table1 a

    GROUP BY id
    )
    update dbo.table0
    set
    attr0 = cte.attr0,
    attr1 = cte.attr1
    from cte where cte.id = table0.id
...