私はMySQLでこのクエリを実行しています
SELECT ID FROM (
SELECT ID, msisdn
FROM (
SELECT * FROM TT2
)
);
そしてそれはこのエラーを与えている:
すべての派生テーブルには独自のエイリアスが必要です。
このエラーの原因は何ですか?
すべての派生テーブル(AKAサブクエリ)には、実際にエイリアスが必要です。すなわち大括弧内の各照会には別名(AS whatever
)を指定する必要があります。これは、残りの外部照会でそれを参照するために使用できます。
SELECT ID FROM (
SELECT ID, msisdn FROM (
SELECT * FROM TT2
) AS T
) AS T
あなたの場合は、もちろん、クエリ全体を次のように置き換えることができます。
SELECT ID FROM TT2
私はあなたにこれをするように頼んでいると思います:
SELECT ID
FROM (SELECT ID,
msisdn
FROM (SELECT * FROM TT2) as myalias
) as anotheralias;
しかし、なぜ最初にこのクエリを書くのでしょうか。
これはエイリアスなしでは書き換えることができない(GROUP BY DISTINCT
はできない)別の例です。
purchases
による購入をcustomers
に記録するstores
というテーブルを想像してみてください。つまり、多対多のテーブルであり、ソフトウェアはどの顧客が複数の店舗で購入したかを知る必要があります。
SELECT DISTINCT customer_id, SUM(1)
FROM ( SELECT DISTINCT customer_id, store_id FROM purchases)
GROUP BY customer_id HAVING 1 < SUM(1);
エラーEvery derived table must have its own alias
で中断します。修正するには:
SELECT DISTINCT customer_id, SUM(1)
FROM ( SELECT DISTINCT customer_id, store_id FROM purchases) AS custom
GROUP BY customer_id HAVING 1 < SUM(1);
(AS custom
エイリアスに注意してください)。