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
)

最初の更新コマンドは、ffact_listテーブルをrespondents_dimからのZipで更新することです。どちらも、panel_idを使用して結合しますが、そのIDを持つ複数のレコードが存在する可能性があり、最新のvalid_from日付を考慮する必要があります。

実行しようとしましたが、以下のエラーが発生します

1064-SQL構文にエラーがあります。1行目の「HAVINGMAX(rd.Valid_From)」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

クエリに何か問題がありますか?

4

2 に答える 2

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 に答える
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 に答える