0
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
)

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

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

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

查询中有什么问题吗?

4

2 回答 2

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
于 2013-02-15T11:33:23.960 回答
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)
于 2013-02-15T08:42:18.113 回答