2015-02-20 3 views
0

Je suis en train de rencontrer un problème étrange avec MySQL. J'ai une requête assez longue (cutted ci-dessous) qui contient une sous-requête:SQL s'exécute bien, mais si utilisé pour créer une vue, j'ai "Code d'erreur: 1242. Sous-requête renvoie plus de 1 ligne"

select 
    SITEID as ID, 
    "Predicted" as KIND, 
    ATTRIBUTE as ATTRIBUTE_ID, 
    "1" as TYPE, 
    (select if(PREDICTEDRATE is null, 0, PREDICTEDRATE) from predictionperhour where siteid = ID and attribute = ATTRIBUTE_ID and TS = date_format((now() - interval 4 hour), '%Y-%m-%d %H:00:00')) as MINUS4, 
    if(PREDICTEDRATE is null, 0, PREDICTEDRATE) as CURRENT, 
    (select if(PREDICTEDRATE is null, 0, PREDICTEDRATE) from predictionperhour where siteid = ID and attribute = ATTRIBUTE_ID and TS = date_format((now() + interval 1 hour), '%Y-%m-%d %H:00:00')) as PLUS1, 
from 
    predictionperhour 
where 
    TS = date_format(now(), '%Y-%m-%d %H:00:00') 
group by 
    SITEID, 
    ATTRIBUTE 

Si je lance cette requête dans SQL Workbench (sans limiter les résultats) Je suis rentré mes 2027 lignes et tout fonctionne bien. Maintenant, si j'utilise le même sélectionner pour créer une vue, puis essayez une simple sélection * à partir de là, j'ai l'erreur ci-dessus "Code d'erreur: 1242. Sous-requête renvoie plus de 1 ligne".

Comment cela a-t-il pu se produire? J'ai essayé de modifier la sous-requête pour faire un compte mais pour autant que je peux voir tous les résultats sont 1 ... J'ai même essayé d'ajouter une LIMIT 1 mais bien que dans ce cas je ne frappe aucune erreur I dire qu'au lieu de récupérer le résultat attendu de la sous-requête je suis revenu 0.

Pourriez-vous m'aider où se trouve le problème?

Merci

Répondre

1

Essayez comme ceci en utilisant des alias pour les tables (p0, p1, p2). Si nous ne l'alias pas, il pourrait y avoir la colonne attribute = ATTRIBUTE_ID de la même table predictionperhour AS p0 de la requête externe pas de la requête interne.

select 
    SITEID as ID, 
    "Predicted" as KIND, 
    ATTRIBUTE as ATTRIBUTE_ID, 
    "1" as TYPE, 
    (select if(PREDICTEDRATE is null, 0, PREDICTEDRATE) from predictionperhour AS p1 where p1.siteid = p0.ID and p1.attribute = p0.ATTRIBUTE_ID and TS = date_format((now() - interval 4 hour), '%Y-%m-%d %H:00:00')) as MINUS4, 
    if(PREDICTEDRATE is null, 0, PREDICTEDRATE) as CURRENT, 
    (select if(PREDICTEDRATE is null, 0, PREDICTEDRATE) from predictionperhour AS p2 where p2.siteid = p0.ID and p2.attribute = p0.ATTRIBUTE_ID and TS = date_format((now() + interval 1 hour), '%Y-%m-%d %H:00:00')) as PLUS1, 
from 
    predictionperhour AS p0 
where 
    TS = date_format(now(), '%Y-%m-%d %H:00:00') 
group by 
    SITEID, 
    ATTRIBUTE 
+0

Très bien! Cela a résolu! La question est de savoir quelles sont les différences de fonctionnement en mode autonome ou en tant que construction à partir d'une vue? –

+0

Bonne question :) Personnellement, je pense que cela dépend de l'optimiseur de requête s'il décide d'exécuter la requête sous-requête ou externe d'abord. – user3714582