Случай обновления таблицы переменных - PullRequest
0 голосов
/ 26 января 2011

У меня (упрощенно для этого примера) TableA с полями Id, Speed ​​и Description.Таблица B содержит модификации таблицы A.Таблица B содержит Id (FK, поэтому будет соответствовать Id в TableA), полях ModifiedSpeed ​​и OriginalSpeed.

По сути, я бы хотел иметь возможность обновить либо TableA Speed, либо TableB OriginalSpeed ​​в пределах одного оператора, основываясь на том, есть ли в TableB запись, относящаяся к TableA.

Вот то, что я пробовал до сих пор, надеюсь, это даст некоторое представление о том, чего я хочу, поскольку я не уверен, что объясняю это очень хорошо:

SELECT a.Id, a.Description, a.Speed, CASE 
    WHEN EXISTS(SELECT b.Id FROM TableB b WHERE b.Id = a.Id) THEN
        UPDATE TableB SET OriginalSpeed = 
            CASE
                WHEN (a.Speed is not null) THEN a.Speed
                WHEN a.Description = 'Motorway' THEN 70
                WHEN a.Description = 'A Road' THEN 60
                ELSE 30
            END
    ELSE
        UPDATE TableA SET Speed =
            CASE
                WHEN (a.Speed is not null) THEN a.Speed
                WHEN a.Description = 'Motorway' THEN 70
                WHEN a.Description = 'A Road' THEN 60
                ELSE 30
            END
END
FROM TableA a

Любая помощь будетоценили.

Ответы [ 3 ]

2 голосов
/ 26 января 2011

Два оператора, как уже говорили другие.

UPDATE
    b
SET
    OriginalSpeed = CASE
                WHEN (a.Speed is not null) THEN a.Speed
                WHEN a.Description = 'Motorway' THEN 70
                WHEN a.Description = 'A Road' THEN 60
                ELSE 30
            END
FROM
    TableB b
        inner join
    TableA a
        on
            b.Id = a.Id

UPDATE
    a
SET
    Speed = CASE
                WHEN (a.Speed is not null) THEN a.Speed
                WHEN a.Description = 'Motorway' THEN 70
                WHEN a.Description = 'A Road' THEN 60
                ELSE 30
            END
FROM
    TableA a
        left join
    TableB b
        on
           a.ID = b.ID
WHERE
    b.ID is null

Первый запрос будет работать только тогда, когда работает соединение между таблицами A и B (поэтому есть совпадение между строками в A & b).Второй запрос, использующий LEFT JOIN и предложение where, обновляет только строки в A, для которых мы не можем найти подходящую строку в B.

2 голосов
/ 26 января 2011

Невозможно обновить две таблицы одним оператором.

1 голос
/ 26 января 2011

Вы, вероятно, должны сделать что-то вроде этого (я предполагаю ваши типы данных):

Create Proc dbo.usp_ProcedureName

@Id int,
@Speed int

As Begin


If Exists (Select ID From TableB Where Id = @Id)
    Begin

        Update TableB
        Set OriginalSpeed = @Speed
        Where Id = @Id


    End
Else
    Begin

        Update TableA
        Set Speed = @Speed
        Where Id = @Id

    End



End
Go

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

Если идентификатор существует в таблице B, то он обновит таблицу B, в противном случае он обновит таблицу A

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...