MySQLの「すべての派生テーブルには独自のエイリアスが必要」というエラーは何ですか?


386

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

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

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

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

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


14
これを「IDをTT2から選択」として単純化できませんか?
DMKing 2009

5
s )が多いクエリに余分なものがあったため、最近このエラーが発生しましたUNION ALL
mpen 2012

10
これが#1 Google検索であると考えてみてください...受け入れられた答えは、実際には「すべての派生テーブルには独自のエイリアスが必要です」というエラーには答えません。詳細については、以下をご覧ください。
ダニエルB.チャップマン

回答:


542

すべての派生テーブル(別名サブクエリ)は実際にエイリアスを持っている必要があります。AS whateverつまり、括弧内の各クエリにはエイリアス()を指定する必要があります。エイリアスを使用して、残りの外部クエリでエイリアスを参照できます。

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

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

SELECT ID FROM TT2

21
表示されているサンプルコードの正解ですが、この質問を調べているほとんどのユーザーに対する解決策ではありません。
ToBe

1
@ToBe私はあなたが何を意味しているのか知りたいですか?答えはどのクエリでも当てはまります。from句に派生テーブルがある場合は、エイリアスを指定する必要があります。
AdamMc331

2
申し訳ありませんが、元のクエリを修正してASステートメントを追加したことは確認できませんでした。あなたは速記だけを見せたと思った。私の反対票を削除しました。
ToBe

私は@ToBeと同じように考えています。答えは次のとおりです。「ここで、派生テーブルは「FROM句で使用されるサブクエリ」を意味します。質問者の場合、これらはかっこ内のサブクエリです。キーワード「as」を使用してエイリアスを指定しない場合これらのクエリの場合、dbmsクエリエンジンは名前(またはエイリアス)なしでどのクエリが何であるかを判別できないため、すべてのサブクエリに一意の名前(エイリアス)を指定して、dbmsクエリエンジンが適切に機能するようにする必要があります。 "
バハディールTasdemir 16

1
サブクエリが必ずしも派生テーブルであるとは限らないことを明確にした方がよいでしょう。FROM句内に直接配置する必要があります。次のようなステートメントSELECT...FROM...WHERE x NOT IN (subquery) AS Tはエラーをトリガーします
ニコラス

76

私はあなたにこれをするように求めていると思います:

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

しかし、なぜ最初にこのクエリを作成するのでしょうか。


16
実際のクエリは長すぎます。私はここの人々がそれを理解する時間が少なくなるように十分に短くしました。短いクエリと長いクエリのエラーは同じでした。
silverkid 2009

今、私は分かる。また、いくつかのコードによって生成された可能性があると考えていました。PaulとDMKingが提案したように、それはまだ単純化するはずです。
ホームトースト2009

9
わあ、これは本当に受け入れられない2番目の答えですか?MySQLは、他の多くの実装のようにそのままにするのではなく、「サブクエリ」にラベルを付けることを要求します。
ダニエルB.チャップマン

17

エイリアスなしで書き換えることができない別の例を次に示します( GROUP BY DISTINCT)。

at purchasesが行った購入を記録するというテーブルを想像してください。つまり、これは多対多のテーブルであり、ソフトウェアは、どの顧客が複数の店舗で購入したかを知る必要があります。customersstores

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エイリアスに注意してください)。


サブクエリに対するSUM(1)の効果は何ですか?
xssChauhan 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.