根据同一个表上的子查询更新表中的行

时间:2011-10-14 11:26:23

标签: sql-server-2005 sql-server-2008

我在'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 个答案:

答案 0 :(得分:2)

最简单的方法是

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 :(得分:1)

您不需要子查询:

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

答案 2 :(得分:1)

您可以将查询结果加回原始表,并使用联接更新后者。方法如下:

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