mysql查询中的错误,用于加入和选择最新的日期记录

时间:2013-02-15 08:37:59

标签: mysql sql-update

UPDATE Fact_List sfl, Respondents_Dim rd SET sfl.Zip = rd.Zip where sfl.Panel_Id=rd.Panel_Id HAVING MAX(rd.Valid_From)

respondents_dim` (
  `Respondents_Key` int(11) NOT NULL AUTO_INCREMENT,
  `Panel_Id` int(11) DEFAULT NULL,
  `First_Name` varchar(100) DEFAULT NULL,
  `Last_Name` varchar(100) DEFAULT NULL,
  `Specialty` varchar(100) DEFAULT NULL,
  `Dataset` varchar(50) DEFAULT NULL,
  `Age` int(11) DEFAULT NULL,
  `Sex` varchar(10) DEFAULT NULL,
  `Zip` varchar(100) DEFAULT NULL,
  `Valid_From` date DEFAULT NULL,
  `Valid_To` date DEFAULT NULL)

CREATE TABLE IF NOT EXISTS `fact_list` (
  `Panel_Id` int(11) DEFAULT NULL,
  `Project_Id` int(11) DEFAULT NULL,
  `Zip` varchar(100) DEFAULT NULL,
  `Employee_Id` int(11) DEFAULT NULL,
  `Created_Date` date DEFAULT NULL
)

第一个更新命令是使用来自respondents_dim的Zip更新fact_list表,其中两者都使用panel_id进行连接,但可能有多个记录具有该id,并且应考虑最新的valid_from日期。

我试图执行它,但它给出了以下错误

  

1064 - 您的SQL语法出错;检查与MySQL服务器版本对应的手册,以便在第1行'HAVING MAX(rd.Valid_From)'附近使用正确的语法

查询中有什么问题吗?

2 个答案:

答案 0 :(得分:0)

尝试使用左连接: -

已修改:删除别名并输入表格名称。

已编辑2 :尝试一次。

    UPDATE Fact_List  left join Respondents_Dim  on Fact_List.Panel_Id=Respondents_Dim.Panel_Id SET Fact_List.Zip = Respondents_Dim.Zip 
where Respondents_Dim.Valid_From in (select  MAX(Respondents_Dim.Valid_From) from Respondents_Dim)

答案 1 :(得分:0)

试试这个:

UPDATE fact_list fl
LEFT JOIN respondents_dim rd
ON rd.Panel_Id = fl.Panel_Id
SET fl. Zip = rd.Zip
WHERE rd.Valid_From = (SELECT MAX(Valid_From) 
                       FROM respondents_dim rd2
                       WHERE rd2.Panel_Id = rd.Panel_Id)

或避免相关子查询:

UPDATE fact_list fl
INNER JOIN respondents_dim rd
ON rd.Panel_Id = fl.Panel_Id
INNER JOIN
   (SELECT Panel_Id, MAX(Valid_From) AS max_Valid_From
    FROM respondents_dim 
    GROUP BY Panel_Id) AS rd2
ON rd.Panel_Id = rd2.Panel_Id 
AND rd.Valid_From = rd2.max_Valid_From
SET fl.Zip = rd.Zip
相关问题