Как обновить столбцы в другой таблице из запроса на выборку? - PullRequest
0 голосов
/ 24 апреля 2019

Я хочу обновить некоторые столбцы в другой таблице из результата запроса. Я продолжаю получать ошибки. Пожалуйста помоги.

Update customer_info
set customer_info.reader_ID     = aisle_info.reader_ID,
    customer_info.tag_no        = tag_logs.tag_no,
    customer_info.area          = aisle_info.area,
    customer_info.max_timestamp = TIMESTAMPDIFF(SECOND,MIN(tag_logs.timestamp),MAX(tag_logs.timestamp)) 

FROM tag_logs
INNER join aisle_info ON tag_logs.reader_ID = aisle_info.reader_ID
WHERE T.tag_no = 515988190124;

1064 - у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования рядом с 'FROM tag_logs

INNER присоединиться к aisle_info ON tag_logs.reader_ID = aisle_info.reader_I 'в строке 5

1 Ответ

0 голосов
/ 26 апреля 2019

Вы были близки. Различные базы данных имеют слегка различный синтаксис при обновлении из select / join. Думайте о MySQL как о выражении select и используйте псевдоним первичной таблицы, которую вы пытаетесь обновить, и после этого идут предложения SET.

Итак, сначала я начну с самостоятельного написания запроса SELECT.

select
      CI.Tag_No,
      AI.Reader_ID,
      AI.Area,
      MIN( TL.TimeStamp ) MinTime,
      MAX( TL.TimeStamp ) MaxTime
   from
      customer_info CI
         join tag_logs TL
            CI.tag_no = TL.tag_no
            join aisle_info AI
               on TL.Reader_ID = Reader_ID
   WHERE 
      CI.tag_no = 515988190124
   group by
      CI.Tag_No,
      AI.Reader_ID,
      AI.Area

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

Затем примените ваше обновление, например

update Customer_Info CIUpd
   JOIN 
   ( select
          CI.Tag_No,
          AI.Reader_ID,
          AI.Area,
          MIN( TL.TimeStamp ) MinTime,
          MAX( TL.TimeStamp ) MaxTime
       from
          customer_info CI
             join tag_logs TL
                CI.tag_no = TL.tag_no
                join aisle_info AI
                   on TL.Reader_ID = Reader_ID
       WHERE 
          -- notice your filter is HERE for the one tag_no you want to update
          -- and will result with only this on TAG_NO set of values returned
          CI.tag_no = 515988190124
       group by
          CI.Tag_No,
          AI.Reader_ID,
          AI.Area ) FirstQuery
      -- the JOIN will ensure updating only on that one tag_no
      ON CIUpd.Tag_No = FirstQuery.Tag_No
   set
      CIUpd.Reader_ID = FirstQuery.Reader_ID,
      CIUpd.Area = FirstQuery.Area,
      CIUpd.Max_TimeStamp = TimeStampDiff( second, FirstQuery.MinTime, FirstQuery.MaxTime )

Теперь это не идеальный ответ, поскольку ваш исходный запрос не был правильным запросом с использованием контекста MIN () / MAX (). При выполнении агрегированного запроса вам необходимо применить группу по всем NON агрегированным столбцам. В этом случае вы не уточнили какие-либо соображения группы относительно Reader_ID и Area, которые МОГУТ привести к нескольким строкам из ваших таблиц tag_logs и aisle_info.

Если информация о проходе будет все время одинаковой для данного Tag_No, тогда это просто, просто пропустите группировку по этому и измените значения извлечения этих столбцов как MAX () каждый. если они никогда не изменятся, MAX () или даже MIN () всегда будут возвращать одно и то же значение и не будут иметь проблем с агрегированным запросом без неагрегированных столбцов.

Если вы можете предоставить дополнительные разъяснения данных, цели и т. Д., Пожалуйста, отредактируйте исходное сообщение, оставив только комментарий. Затем оставьте комментарий для меня, пожалуйста, обзор с обновленной информацией.

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