Обновление нескольких строк одновременно - PullRequest
3 голосов
/ 07 июля 2011

Можно ли обновить несколько строк одновременно?

Следующий запрос возвращает информацию о текущем отделе, над которым работает сотрудник.

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]
    ...

но я хочу знать, возможно ли обновить все эти значения сразу, без использования цикла.

EDIT:

У меня есть один стол. И мне нужно запросить ту же таблицу. Эта таблица не имеет отношения к каким-либо другим таблицам. Структура таблицы:

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

Ответы [ 3 ]

10 голосов
/ 07 июля 2011

вы можете попробовать это

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)

Это всего лишь пример, вы можете расширить его для вашего случая.

Проверьте руководство для получения дополнительной информации

2 голосов
/ 08 июля 2011

Можете ли вы попробовать это?

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
0 голосов
/ 07 июля 2011

Это может быть возможно только в том случае, если вы хотите обновить каждый с тем же значением, тогда вы можете использовать предложение where с IN.

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