2017-04-20 69 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'并且它仍然抛出相同的错误。 –