如何通过选择查询更新另一个表中的列?

时间:2019-04-24 20:10:18

标签: mysql sql

我想根据查询结果更新另一个表中的某些列。我不断出错。请帮忙。

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.HBox?>


<HBox fx:id="hBox" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="javafxapplication363.FXMLDocumentController" />

1064-您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,以获取在'FROM tag_logs

附近使用的正确语法

在第5行的INNER处加入aisle_info ON tag_logs.reader_ID = aisle_info.reader_I'

1 个答案:

答案 0 :(得分:0)

你很近。不同的数据库在选择/联接的更新中的语法略有不同。将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和过道信息表中出现多行。

如果对于给定的Tag_No,过道信息始终都是相同的,那么这很简单,只需跳过该分组,然后将这些列检索值分别更改为MAX()。如果它们永远不变,则MAX()甚至MIN()都将始终返回相同的值,并且在没有非聚合列的情况下聚合查询不会出现问题。

如果您可以提供其他数据,目的等方面的说明,请编辑您的原始帖子,而不要发表评论。然后给我留言,以获取更新信息。