一次更新多行

时间:2011-07-07 12:04:05

标签: sql postgresql

是否可以同时更新多行?

以下查询返回当前部门的信息,员工正在处理。

SELECT  a.empID, a.deparmentID 
FROM customer a  
INNER JOIN (
 SELECT  f.empID, max(f.myDate) md 
 FROM customer f 
GROUP BY f.empID
) z ON z.empID = a.empID AND z.md = a.myDate

例如,以下是我的表格样本:

empID       deparmentID         myDate
1           1                   2011-01-01
2           1                   2011-02-10
3           2                   2011-02-19
1           2                   2011-03-01
2           3                   2011-04-01
3           1                   2011-05-10
1           3                   2011-06-01

所以上面的查询将返回

empID   departmentID        
1       3
2       3
3       1

现在基于这些返回值,我想一次更新我的表。

目前我正在使用for循环一次更新这些值(性能非常慢),

我的更新查询是:

for row in somerows:    
    UPDATE facttable SET deparment = row[1] WHERE empID = row[0]
    ...

但我想知道是否可以在不使用循环的情况下立即更新所有这些值。

修改

我有一张桌子。我需要查询同一个表。此表与任何其他表无关。 表结构是:

Table Name : Employee
Fields: EmpID varchar
        DeptID varchar
        myDate  date

3 个答案:

答案 0 :(得分:10)

你可以试试这个

UPDATE mytable
SET myfield = CASE other_field
    WHEN 1 THEN 'value1'
    WHEN 2 THEN 'value2'
    WHEN 3 THEN 'value3'
END
WHERE id IN (1,2,3)

这只是一个例子,你可以根据你的情况扩展它。

查看manual了解详情

答案 1 :(得分:2)

你能试试吗?

UPDATE customer c
SET depatmentID = 
    ( SELECT a.deparmentID 
      FROM customer a 
        INNER JOIN 
          ( SELECT empID
                 , max(myDate) AS md 
            FROM customer 
            GROUP BY empID
          ) AS z 
        ON  z.empID = a.empID
        AND z.md = a.myDate
      WHERE a.empID = c.empID
    )

或者这个:

UPDATE customer AS c
SET depatmentID = a.derpmentID 
FROM customer a 
  INNER JOIN 
    ( SELECT empID
           , max(myDate) AS md 
      FROM customer 
      GROUP BY empID
    ) AS z 
    ON  z.empID = a.empID
    AND z.md = a.myDate
WHERE a.empID = c.empID

答案 2 :(得分:-2)

只有在您想要使用相同的值更新每个值时才可以这样做,然后您可以将where子句与IN一起使用。