Обновление строки в таблице на основе подзапроса в той же таблице - PullRequest
2 голосов
/ 14 октября 2011

У меня есть столбец в 'tableA', который я хотел бы обновить с помощью результата следующего запроса. По сути, 5-й столбец даты будет максимальной датой из 4 других столбцов в той же строке.

select  
    Case
        when date1 >= date2 and date1 >= date3 and date1 >=date4 then date1

        when date2 >= date1 and date2 >= date3 and date2 >=date4 then date2

        when date3 >= date1 and date3 >= date2 and date3 >=date4 then date3

        when date4 >= date1 and date4 >= date2 and date4 >=date3 then date4
    End as Date5
from
tableA      

Однако я не могу получить правильный синтаксис в операторе update, поскольку я получаю либо ошибку с несколькими строками, либо ошибку другого типа. например

update tableA a
set Date5 = (
    select  
        Case
            when date1 >= date2 and date1 >= date3 and date1 >=date4 then date1

            when date2 >= date1 and date2 >= date3 and date2 >=date4 then date2

            when date3 >= date1 and date3 >= date2 and date3 >=date4 then date3

            when date4 >= date1 and date4 >= date2 and date4 >=date3 then date4
        End as Date5
    from
    tableA b)
where A.ID = B.ID

Спасибо за любую помощь!


Обновление ниже


После еще одного исследования я решил найти другое решение для получения максимальной даты, например

    Select Max(dDate) maxDate, ID
      From tableA
           Unpivot (dDate FOR nDate in (Date1, Date2, Date3)) as u
     Group by ID

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

Ответы [ 3 ]

2 голосов
/ 15 октября 2011

Самый простой способ сделать это будет

UPDATE tableA
SET    date5 = (SELECT MAX(D)
                FROM   (VALUES(date1),
                              (date2),
                              (date3),
                              (date4)) T(D))  

Или (как вы сейчас добавили тег 2005)

UPDATE tableA
SET    date5 = (SELECT MAX(D)
                FROM   (SELECT date1 UNION ALL
                        SELECT date2 UNION ALL
                        SELECT date3 UNION ALL
                        SELECT date4) T(D))  
1 голос
/ 15 октября 2011

Вы можете присоединить результат запроса обратно к исходной таблице и обновить ее, используя объединение.Вот как:

UPDATE a
SET Date5 = s.maxDate
FROM TableA a
  INNER JOIN (
    Select Max(dDate) maxDate, ID
      From tableA
           Unpivot (dDate FOR nDate in (Date1, Date2, Date3)) as u
     Group by ID
  ) s ON a.ID = s.ID
1 голос
/ 14 октября 2011

Вам не нужен подзапрос:

update tableA a
   set Date5 = Case
                   when date1 >= date2 and date1 >= date3 and date1 >=date4 then date1

                   when date2 >= date1 and date2 >= date3 and date2 >=date4 then date2

                   when date3 >= date1 and date3 >= date2 and date3 >=date4 then date3

                   when date4 >= date1 and date4 >= date2 and date4 >=date3 then date4
               End
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...