2017-04-20 55 views
0

我有一個導致錯誤下面的查詢腳本:MySql的更新不承認臨時表

SET @row_number = 0; 

Drop Table If Exists testtable2; 

Create Temporary Table testtable2 
SELECT 
    * 
FROM 
    (SELECT 
     row_names, (@row_number:[email protected]_number + 1) AS num, date_add(date_time, INTERVAL 1 MINUTE) AS date_time, meter, kw 
    FROM 
     testtable 
    WHERE 
     DAY(date_time) = 1 
      AND HOUR(date_time) = 2) AS testtable2 
WHERE 
    MOD(testtable2.num, 2) = 0; 

UPDATE testtable 
SET 
    testtable.date_time = testtable2.date_time 
WHERE 
    testtable.row_names = testtable2.row_names; 

錯誤說Error Code: 1054. Unknown column 'testtable2.row_names' in 'where clause'

我創建了一個包含列DATE_TIME但我更新的臨時表查詢無法識別該列是否存在。我可以運行像SELECT * FROM testtable2;並返回顯示該列確實是使用正確的標題生成的。爲什麼我的更新無法識別此列?

回答

1

這是你update語句執行UPDATE

UPDATE testtable 
SET testtable.date_time = testtable2.date_time 
WHERE testtable.row_names = testtable2.row_names; 

什麼是testtable?你還沒有定義。您創建了testtable2。如果你有testtable,那麼也許你想要一個join

UPDATE testtable tt JOIN 
     testtable2 tt2 
     ON tt.row_names = tt2.row_names 
    SET tt.date_time = tt2.date_time; 
+0

testtable是我已經在我的數據庫中擁有的表。它有列row_names,date_time,米和千瓦。 –

1

你實際上打算使用CREATE TABLE ... AS結構,但在你的情況下它是錯誤地形成的。它應該如下所示。

Create Temporary Table testtable2 AS 
SELECT 
    * 
FROM 
    (SELECT 
     row_names, (@row_number:[email protected]_number + 1) AS num, 
     date_add(date_time, INTERVAL 1 MINUTE) AS date_time, 
     meter, 
     kw 
    FROM 
     testtable 
    WHERE 
     DAY(date_time) = 1 
      AND HOUR(date_time) = 2) AS XXX <-- Here 
WHERE 
    MOD(testtable2.num, 2) = 0; 

問題在你的情況是,你的臨時表和內聯視圖別名是相同的。命名他們不同。請參閱編輯的查詢


您可以直接JOIN與內查詢,可以像

UPDATE testtable 
JOIN (
SELECT 
    * 
FROM 
    (SELECT 
     row_names, (@row_number:[email protected]_number + 1) AS num, date_add(date_time, INTERVAL 1 MINUTE) AS date_time, meter, kw 
    FROM 
     testtable 
    WHERE 
     DAY(date_time) = 1 
      AND HOUR(date_time) = 2) AS testtable2 
WHERE 
    MOD(testtable2.num, 2) = 0) xx ON testtable.row_names = xx.row_names 
SET 
    testtable.date_time = xx.date_time; 
+0

我加入了在我創建表,但它仍然給了我同樣的錯誤。 –

+0

@DustinKnight,如果有幫助,請參閱編輯答案。 – Rahul

+0

我將代碼'AND HOUR(date_time)= 2)AS XXX'更改爲'AND HOUR(date_time)= 2)AS temporarydata'並且它仍然拋出相同的錯誤。 –