Обновить несколько строк на основе нескольких значений - PullRequest
2 голосов
/ 18 августа 2011

Допустим, у меня есть это:

Declare @passRefID as int
Declare @passTextA as varchar
Deckare @oassTextB as varchar
Declare @passPropertyA as int
Declare @passPropertyB as int


Set @oassTextA = 'Joe'
Set @passTextB = 'Smith'
Set @passPropertyA = 21
Set @passPropertyB = 23

TSQL A:

Set @passRefID = Select Ref_ID from TableA where ID = 10

Ref_ID возвращает значение 50

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

TSQL B:

Select UserID from TableB where FK_RefID = @passRefID

Допустим, он возвращает:

UserID
34
56
87

Теперь я хочу создать обновление для TableC на основе UserID, которые возвращаются ранее.

My TableC макет записи выглядит так:

ID,   UserID, PropertyDefinitionID, PropertyValue
265,  34,     21,                    Bob
266,  34,     23,                    Barker
271,  34,     55,                    bb@abc.com
628,  56,     21,                    Jane
629,  56,     23,                    Adams
635,  56,     55,                    ja@abc.com
901,  83,     21,                    Tom
905,  83,     23,                    Thumb
910,  83,     55,                    tt@abc.com

Я знаю, что могу использовать:

Update TableC Set PropertyValue = @oassTextA Where UserID = 34 and PropertyDefinitionID = @passPropertyA
Update TableC Set PropertyValue = @oassTextB Where UserID = 34 and PropertyDefinitionID = @passPropertyB
Update TableC Set PropertyValue = @oassTextA Where UserID = 56 and PropertyDefinitionID = @passPropertyA
Update TableC Set PropertyValue = @oassTextB Where UserID = 56 and PropertyDefinitionID = @passPropertyB
Update TableC Set PropertyValue = @oassTextA Where UserID = 83 and PropertyDefinitionID = @passPropertyA
Update TableC Set PropertyValue = @oassTextB Where UserID = 83 and PropertyDefinitionID = @passPropertyB

Но моя проблема в том, что в TSQL B эти возвращаемые строки могут отличаться. Может быть возвращено 1 строка или 100 строк, и TableC сконструирован немного иначе, чем норма.

Как создать динамический оператор UPDATE на основе количества возвращаемых строк с использованием уникальных идентификаторов USERID и способа, которым TableC использует PropertyDefinitionID?

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 18 августа 2011
UPDATE  TableC
SET     PropertyValue = CASE WHEN PropertyDefinitionID = @passPropertyA
                             THEN @oassTextA
                             ELSE @oassTextB
                        END
WHERE   PropertyDefinitionID IN ( @passPropertyA, @passPropertyB )
        AND UserID IN (
        SELECT  B.UserID
        FROM    TableB AS B
                INNER JOIN TableA AS A ON A.Ref_ID = B.FK_RefID
        WHERE   A.Id = 10 )
...