2017-04-20 2 views
0

je le script de requête suivante qui entraîne une erreur:mise à jour MySql ne reconnaissant pas la table temporaire

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; 

L'erreur dit Error Code: 1054. Unknown column 'testtable2.row_names' in 'where clause'

Je crée une table temporaire qui contient la colonne date_time mais ma mise à jour requête ne parvient pas à reconnaître que la colonne existe. Je peux lancer quelque chose comme SELECT * FROM testtable2; et il retourne montrant que la colonne est en effet générée avec le titre correct. Pourquoi ma mise à jour ne reconnaît-elle pas cette colonne?

Répondre

1

Ceci est votre déclaration update:

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

Qu'est-ce que testtable? Vous n'avez pas défini cela. Vous avez créé testtable2. Si vous avez testtable, alors peut-être vous voulez un join:

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

testtable est une table que j'ai déjà dans ma base de données. il a les colonnes row_names, date_time, meter et kw. –

1

Vous vouliez en fait utiliser la construction CREATE TABLE ... AS mais dans votre cas, elle est mal formée. Ça devrait être comme ci-dessous.

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; 

Problème dans votre cas, vos alias de table temporaire et de vue en ligne sont identiques. nomme-les différemment. Voir requête éditée


Vous pouvez directement JOIN avec la requête interne et peut effectuer UPDATE comme

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

J'ai ajouté l'AS dans ma create table mais il me donne toujours la même erreur. –

+0

@DustinKnight, voir modifier en réponse si cela vous aide. – Rahul

+0

J'ai changé le code 'AND HEURE (date_time) = 2) AS XXX' à' ET HEURE (date_time) = 2) AS temporarydata' et il lance toujours la même erreur. –