MySql 更新无法识别临时 table

MySql update not recognizing temporary table

我有以下导致错误的查询脚本:

SET @row_number = 0;

Drop Table If Exists testtable2;

Create Temporary Table testtable2
SELECT 
    *
FROM
    (SELECT 
        row_names, (@row_number:=@row_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 的临时 table,但我的更新查询无法识别该列的存在。我可以 运行 类似 SELECT * FROM testtable2;它 returns 表明该列确实是用正确的标题生成的。为什么我的更新无法识别此列?

您实际上是想使用 CREATE TABLE ... AS 构造,但在您的情况下它的格式有误。它应该像下面这样。

Create Temporary Table testtable2 AS
SELECT 
    *
FROM
    (SELECT 
        row_names, (@row_number:=@row_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;

您的问题是,您的临时 table 和内联视图别名相同。以不同的方式命名它们。查看编辑后的查询。


您可以直接 JOIN 使用内部查询,并且可以像

一样执行 UPDATE
UPDATE testtable 
JOIN (
SELECT 
    *
FROM
    (SELECT 
        row_names, (@row_number:=@row_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;

这是您的 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;