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)'附近使用正确的语法
查询中有什么问题吗?
答案 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