web-dev-qa-db-fra.com

La table de l'un des SELECTS ne peut pas être utilisée dans la liste des champs

J'essaie la requête suivante dans une base de données MySQL:

SELECT 
    alert.name, alert.new_state_date, alert.prev_state_date
FROM
    grafana.alert
WHERE
    alert.id = 1 
UNION SELECT 
    annotation.Epoch
FROM
    grafana.annotation
ORDER BY annotation.id DESC
LIMIT 1;

Mon intention est de simplement obtenir les données affichées dans le même panneau afin que je puisse arrêter de basculer. Cependant, j'obtiens l'erreur suivante:

Code d'erreur: 1250. La table 'annotation' de l'un des SELECT ne peut pas être utilisée dans la liste des champs

4
MrDuk

Pour rendre les deux requêtes compatibles pour un UNION remplissez la liste des colonnes du second avec NULLs pour correspondre à la longueur de celle du premier. Pour être sûr que les types de la première colonne correspondent, vous pouvez explicitement les cast() les char. (Facultatif s'ils sont déjà de types compatibles.)

Utiliser aussi UNION ALL parce que UNION (sans ALL) tente d'éliminer les doublons.

Et je suppose que le ORDER BY était destiné au résultat FROM grafana.annotatio pas pour l'ensemble des résultats. Pour que MySQL le sache, mettez la deuxième requête entre parenthèses.

SELECT cast(alert.name AS char),
       alert.new_state_date,
       alert.prev_state_date
       FROM grafana.alert
       WHERE alert.id = 1 
UNION ALL
(SELECT cast(annotation.Epoch AS char),
        NULL,
        NULL
        FROM grafana.annotation
        ORDER BY annotation.id DESC
        LIMIT 1);

Si les deux requêtes renvoient une ligne, vous pouvez également les croiser pour obtenir les résultats côte à côte.

SELECT *
       FROM (SELECT alert.name,
                    alert.new_state_date,
                    alert.prev_state_date
                    FROM grafana.alert
                    WHERE alert.id = 1) x
            CROSS JOIN (SELECT annotation.Epoch
                               FROM grafana.annotation
                               ORDER BY annotation.id DESC
                               LIMIT 1) y;
3
sticky bit