このクエリをMySQLで実行しています
SELECT ID FROM (
SELECT ID, msisdn
FROM (
SELECT * FROM TT2
)
);
そしてそれはこのエラーを与えています:
すべての派生テーブルには、独自のエイリアスが必要です。
このエラーの原因は何ですか?
このクエリをMySQLで実行しています
SELECT ID FROM (
SELECT ID, msisdn
FROM (
SELECT * FROM TT2
)
);
そしてそれはこのエラーを与えています:
すべての派生テーブルには、独自のエイリアスが必要です。
このエラーの原因は何ですか?
すべての派生テーブル(別名サブクエリ)には、実際にエイリアスが必要です。つまり、括弧内の各クエリにはエイリアス(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
(エイリアスに注意してください)。
私がここに到着したのは、適切な回答があるかどうか、このエラーを引き起こした構文エラーの後、または自分で回答を投稿できるかどうかを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
、、、、が含まれます。key1
key2
key3
次に、イニシャルを使用してSELECT
、最後に、生成されたテーブル( )id
からとを選択します。key1
tt