web-dev-qa-db-ja.com

SELECTの1つからのテーブルはフィールドリストで使用できません

MySQLベースのDBで次のクエリを試行しています。

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;

私の意図は、同じパネルにデータを表示するだけで、切り替えを停止できるようにすることです。ただし、次のエラーが発生します。

エラーコード:1250。いずれかのSELECTからのテーブル '注釈'をフィールドリストで使用できません

4
MrDuk

2つのクエリにUNIONの互換性を持たせるには、2番目のクエリの列リストにNULLsを入力して、最初のクエリの長​​さと一致させます。最初の列の型が一致することを確認するには、それらを明示的にcast()charにすることができます。 (すでに互換性のあるタイプの場合はオプションです。)

UNIONALLなし)は重複を排除しようとするため、UNION ALLも使用します。

そして、ORDER BYは結果セット全体ではなく結果FROM grafana.annotatioを意図したものだと思います。 MySQLにそれを知らせるには、2番目のクエリを括弧で囲みます。

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);

両方のクエリが1行を返す場合、それらをクロス結合して、結果を並べて表示することもできます。

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