web-dev-qa-db-ja.com

MySQLのエラー「すべての派生テーブルは独自のエイリアスを持つ必要があります」とは何ですか?

私はMySQLでこのクエリを実行しています

SELECT ID FROM (
    SELECT ID, msisdn
    FROM (
        SELECT * FROM TT2
    )
);

そしてそれはこのエラーを与えている:

すべての派生テーブルには独自のエイリアスが必要です。

このエラーの原因は何ですか?

336
silverkid

すべての派生テーブル(AKAサブクエリ)には、実際にエイリアスが必要です。すなわち大括弧内の各照会には別名(AS whatever)を指定する必要があります。これは、残りの外部照会でそれを参照するために使用できます。

SELECT ID FROM (
    SELECT ID, msisdn FROM (
        SELECT * FROM TT2
    ) AS T
) AS T

あなたの場合は、もちろん、クエリ全体を次のように置き換えることができます。

SELECT ID FROM TT2
467
Paul

私はあなたにこれをするように頼んでいると思います:

SELECT ID
FROM (SELECT ID,
             msisdn 
      FROM (SELECT * FROM TT2) as myalias
     ) as anotheralias;

しかし、なぜ最初にこのクエリを書くのでしょうか。

73
hometoast

これはエイリアスなしでは書き換えることができない(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エイリアスに注意してください)。

13