2015-04-07 2 views
-1

Я пытаюсь сделать следующее:Копирование даты в колонке из другой таблицы с критериями

Одна таблица в базе данных называется service_state_history, что таблица имеет три колонки:

  • service_id - который ссылается на идентификатор службы, с которой связано service_state. (это не внешний ключ, потому что в этом случае отношение выполняется в JPA-коде).

  • state_started столбец с DATETIME значениями, указывающими при запуске состояния в этой строке.

  • state колонна, которая описывает состояние этой записи истории и имеет следующие VARCHAR-значения: (STANDBY, IN PROGRESS, DONE)

другой таблицы в базе данных называется services, что таблица имеет два соответствующие столбцы:

  • id BigInt
  • done_date DATETIME

Теперь, что я должен сделать, это обновляет done_date столбец в services из колонка service_state_history таблицы state_started, если значение state столбца в строке является DONE и значение service_id в матчах id в services ,

Как это переводит на SQL?

+0

Может быть выполнено либо с помощью JOIN, либо с подзапросом. –

ответ

1

Таким образом, чтобы получить все записи, которые будут обновления таблицы назначения, вы будете использовать результаты, полученные от:

SELECT service_id, state_started, state 
FROM service_state_history 
WHERE state = 'DONE' 

Для выполнения UPDATE вам нужно JOIN этот набор результатов в таблицу назначения на столбец идентификаторов и использовать в обновлении state_started. Что-то вроде:

UPDATE s 
SET s.done_date = ssh.state_started 
FROM services s 
INNER JOIN service_state_history ssh ON ssh.service_id = s.id 
WHERE ssh.state = 'DONE' 
+0

Совершенно прост - но может быть целесообразно избегать «более обновления». Например, у ssh может быть очень много записей для s (я предполагаю, что службы могут запускаться несколько раз), поэтому вам может потребоваться только обновление s до «последнего» значения совпадающего ssh (добавление группы по и max), и не обновляйте s, где строка уже указана. Это может быть особенно важно, когда есть триггеры на s. – Clay

+0

@ Clay Я могу видеть вашу точку зрения и соглашаться в принципе, но OP не указал ни одну из этих данных. Без более детального вопроса все это будет основываться на предположениях. – Tanner

+2

согласился на 100%. Я все еще чувствую себя из-за недавнего опыта в этой проблеме и полагаю, что это не помешает бросить битву в мышление OP (или кто-либо другой, который может прочитать это позже). – Clay

Смежные вопросы