2011-07-07 100 views
3

是否可以同時更新多行?一次更新多行

以下查詢返回當前部門的信息,員工正在處理。

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 row in somerows:  
    UPDATE facttable SET deparment = row[1] WHERE empID = row[0] 
    ... 

,但我想知道是否有可能一次更新所有這些值而不使用循環。

編輯:

我有一個表。我需要查詢同一張表。此表與任何其他表都沒有關係。 表結構是:

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

如果我理解正確的話,這將導致你,你將設置EMPID 1部1(第一條記錄)的問題,然後做與DEP類似的更新。 2和3。我看不到這方面的優勢。如果最後的設置應該贏,那麼考慮觸發器可能是一個想法。 –

+0

我可以問你爲什麼要這麼做? –

回答

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

如果要更新每個相同的值。這隻能是可能的,那麼你可以使用WHERE子句在。

8

你可以試試這個

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更多信息