ビューのSELECTのFROM句にサブクエリが含まれています


111

テーブルが2つあり、ビューを作成する必要があります。テーブルは次のとおりです。

credit_orders(id, client_id, number_of_credits, payment_status)
credit_usage(id, client_id, credits_used, date)

これを行うには、次のクエリを使用します。「ビューの作成」の部分がないクエリは適切に機能しますが、「ビューの作成」では、「ビューのSELECTにFROM句にサブクエリが含まれています」というエラーが表示されます。問題と考えられる解決策は何ですか?

create view view_credit_status as 
(select credit_orders.client_id, 
        sum(credit_orders.number_of_credits) as purchased, 
        ifnull(t1.credits_used,0) as used 
 from credit_orders
 left outer join (select * from (select credit_usage.client_id, 
                                        sum(credits_used) as credits_used 
                                 from credit_usage 
                                 group by credit_usage.client_id) as t0
                  ) as t1 on t1.client_id = credit_orders.client_id
 where credit_orders.payment_status='Paid'
 group by credit_orders.client_id)


@MattFenwick、そうではありません-そのクエリは簡単に書き換えることができますが、これは一般的に不可能です
TMS

サブクエリは10.2、バージョン10.2.1Seeのmariadbでサポートされています-jira.mariadb.org/browse/MDEV-3944
Adarsh Madrecha

回答:


157

ドキュメントに従って:

MySQLドキュメント

  • SELECTステートメントのFROM句にサブクエリを含めることはできません。

回避策は、サブクエリごとにビューを作成することです。

次に、ビュー内からそれらのビューにアクセスします view_credit_status


17
ビューをネストすると、パフォーマンスが著しく低下する可能性があることに注意してください。
ミゲルコバン2013年

1
@miguelcobain、入れ子にするためだけに新しいビューを作成しても、あなたが話している「重大なパフォーマンスのペナルティ」が取り除かれることはありません。だから何を与えるのですか?
Pacerier

28
5.7で許可されました!:-)
フランソワ・ブルトン

4
MariaDBでも許可されない
ピーター、

16
create view view_clients_credit_usage as
    select client_id, sum(credits_used) as credits_used 
    from credit_usage 
    group by client_id

create view view_credit_status as 
    select 
        credit_orders.client_id, 
        sum(credit_orders.number_of_credits) as purchased, 
        ifnull(t1.credits_used,0) as used 
    from credit_orders
    left outer join view_clients_credit_usage as t1 on t1.client_id = credit_orders.client_id
    where credit_orders.payment_status='Paid'
    group by credit_orders.client_id)

13

ビューの制限に関する最新のMySQLドキュメントでは、次のように述べています。

MySQL 5.7.7より前では、サブクエリはビューのFROM句では使用できません。

つまり、MySQL v5.7.7以降を選択するか、既存のMySQLインスタンスをそのようなバージョンにアップグレードすると、ビューに対するこの制限が完全に削除されます。

ただし、v5.7.7より前の本番MySQLバージョンを使用している場合、ビューに対するこの制限の削除は、アップグレードするかどうかを決定する際に評価される基準の1つにすぎません。他の回答で説明されている回避策の手法を使用することは、少なくとも短期的には、より実行可能な解決策になる可能性があります。


0

MySQL 3.6が次のエラーを返すのに対し、MySQL 3.7はエラーを出さないように見えます。この修正に関するドキュメントにはまだ何も見つかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.