Обновите и выберите за один проход - PullRequest
2 голосов
/ 07 декабря 2011

У меня есть таблица служебных записей, в которой хранятся рабочие часы нескольких пользователей (промежуточный итог) и идентификатор пользователя (идентификатор добровольца).С помощью следующего оператора выбора я собираюсь установить общее количество часов для каждого идентификатора пользователя:

SELECT
dutyrecord.VolunteerID,
SEC_TO_TIME( SUM( TIME_TO_SEC( SubTotal ) ) ) AS total
FROM
volunteerinfo
INNER JOIN
dutyrecord ON
( volunteerinfo.VolunteerID = dutyrecord.VolunteerID )
GROUP BY
dutyrecord.VolunteerID

Могу ли я объединить оператор обновления с выбором, чтобы обновить общее количество часов для каждого пользователя?Я попробовал что-то подобное и какой-то другой метод, но безуспешно:

UPDATE volunteerinfo 
SET 
TotalHours = 
( 
SELECT dutyrecord.VolunteerID , 
SEC_TO_TIME( SUM( TIME_TO_SEC( SubTotal ) ) ) AS total
FROM 
volunteerinfo
INNER JOIN 
dutyrecord ON ( volunteerinfo.VolunteerID = dutyrecord.VolunteerID )
GROUP BY 
dutyrecord.VolunteerID 
)
WHERE 
volunteerinfo.VolunteerID = dutyrecord.VolunteerID`

Может кто-нибудь помочь мне в этом?

ОБНОВЛЕНИЕ
Извините, несколько попытоки другие примеры я выясняю ответ и более понятный способ задать свой вопрос.Чтобы очистить мой вопрос: могу ли я объединить этот процесс в один, так как я хочу сделать этот язык процесса независимым?(Я просто ношу 1 оператор SQL в разных исполнениях.)

  • Сначала я выбираю таблицу, чтобы дать мне сумму рабочих часов для каждого человека

    SELECT VolunteerID,SEC_TO_TIME (SUM (TIME_TO_SEC (SubTotal))) в качестве итоговой суммы от записи обязанностей GROUP BY VolunteerID

    например, ID: 10001, 1:00:02 ID: 2001, 10:00:34 ....

  • После этого я хочу обновить результат (всего) в другую таблицу в соответствии с их идентификатором

    обновить Volunteerinfo set Volunteerinfo.totalhours = dutyrecord.total где Volunteerinfo.VolunteerID = dutyrecord.VolunteerID

Ответы [ 2 ]

0 голосов
/ 08 декабря 2011

Мой ответ на этот вопрос - сначала объединить обе таблицы, а затем оператор update и select будет работать в одну строку.Пожалуйста, также прокомментируйте меня, если внутреннее соединение или другие способы повысят производительность этого запроса.

update volunteerinfo I 
 join
  (SELECT VolunteerID, SEC_TO_TIME( SUM( TIME_TO_SEC( SubTotal ) ) ) AS total
FROM dutyrecord
GROUP BY VolunteerID) R on R.volunteerid = I.volunteerid
set I.totalhours = R.total
0 голосов
/ 07 декабря 2011

Проблема в том, что вы обновляете только одно поле TotalHours, но ваш подзапрос выбирает 2 поля (оба dutyRecord.VolunteerID и total).Просто удалите dutyrecord.VolunteerID из вашего подзапроса, и он должен работать.Новый запрос должен выглядеть следующим образом:

EDIT: Вам также необходимо включить dutyrecord в оператор UPDATE, поскольку вы ссылаетесь на него в условиях WHERE.

UPDATE volunteerinfo, dutyrecord 
SET 
volunteerinfo.TotalHours = 
( 
SELECT 
SEC_TO_TIME( SUM( TIME_TO_SEC( SubTotal ) ) ) AS total
FROM 
volunteerinfo
INNER JOIN 
dutyrecord ON ( volunteerinfo.VolunteerID = dutyrecord.VolunteerID )
GROUP BY 
dutyrecord.VolunteerID 
)
WHERE 
volunteerinfo.VolunteerID = dutyrecord.VolunteerID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...