3

select * as t次のようなステートメントがmysqlサブクエリに表示されるのはなぜだろうと思っています。

以下は、列に従って、テーブル内の最も古い 3 行を削除しcreated_timeます。

なぜこれが正しいのですか

DELETE FROM mytable WHERE id = ANY 
( SELECT * FROM ( SELECT id FROM mytable ORDER BY created_time ASC LIMIT 3')as t)

そしてそうではない

DELETE FROM mytable WHERE id = ANY 
(SELECT id FROM mytable ORDER BY created_time ASC LIMIT 3) 

?

私には、2 番目の形式が理にかなっています。それは機能しません。最初のものが必要な理由を理解したいと思います。具体的には、何が何で、何をtするのas tでしょうか?

4

1 に答える 1

3

多くのデータベースでは、句のサブクエリにfrom明示的なエイリアスが必要です。はasオプションです。私は通常as、列に使用し、テーブルには使用しません。

DELETE FROM mytable
    WHERE id = ANY ( SELECT * FROM ( SELECT id FROM mytable ORDER BY created_time ASC LIMIT 3') t)

サブクエリが必要な理由は、MySQL の気まぐれです。deleteorのテーブル参照をupdateサブクエリ句に含めることはできません。ああ、それはサブクエリ内のサブクエリ句でそれを許可します。したがって、この制限を回避するのは非常に簡単です。

于 2013-02-19T16:59:26.623 に答える