457

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

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

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

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

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

4

4 に答える 4

622

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

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

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

SELECT ID FROM TT2
于 2009-12-11T15:31:39.800 に答える
85

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

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

しかし、なぜそもそもこのクエリを書くのでしょうか?

于 2009-12-11T15:28:14.387 に答える
20

これは、エイリアスなしでは書き換えられない(できないGROUP BY DISTINCT)別の例です。

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

于 2013-07-05T23:47:34.340 に答える
7

私がここに到着したのは、適切な回答があるかどうか、このエラーを引き起こした構文エラーの後、または自分で回答を投稿できるかどうかをSOでチェックする必要があると思ったためです。

OK、ここでの答えはこのエラーが何であるかを説明しているので、言うことはあまりありませんが、それでも私は自分の言葉を使って2セントを与えます:

このエラーは、基本的に、コマンドのサブクエリを使用して新しいテーブルを生成することが原因で発生しますFROM

それがaderived tableであり、そのため、alias(実際にはそれへの名前参照)が必要です。

次の架空のクエリがあるとします。

SELECT id, key1
FROM (
    SELECT t1.ID id, t2.key1 key1, t2.key2 key2, t2.key3 key3
    FROM table1 t1 
    LEFT JOIN table2 t2 ON t1.id = t2.id
    WHERE t2.key3 = 'some-value'
) AS tt

最後に、FROMコマンド内のサブクエリ全体で、エイリアスが付けられたテーブルが生成され、tt次の列id、、、、が含まれます。key1key2key3

次に、イニシャルを使用してSELECT、最後に、生成されたテーブル( )idからとを選択します。key1tt

于 2020-09-16T09:39:56.337 に答える