2015-04-01 34 views
0

使用Rails遷移(但並不重要)。我想在這裏創建一個視圖,但我得到了Mysql2 ::錯誤:視圖的SELECT在運行rails遷移時在FROM子句中包含子查詢

Mysql2::Error: View's SELECT contains a subquery in the FROM clause: 
CREATE VIEW `lanciao` AS 

當我試試這個:

create view lanciao as 
    select 
    subtime(payment.created_at, '0 5:0:0') as transaction_date, 
    `order_item`.total_quantity, 
    payment.amount as amount, 
    `order`.payment_type 
    from payments payment 
    join orders `order` on `order`.id = payment.order_id 
    left join donation_items donation on donation.order_id = `order`.id 
    inner join (
    select order_id, sum(quantity) total_quantity 
    from order_items 
    group by order_id 
) `order_item` on `order`.id = `order_item`.order_id 
    where payment.payment_state in ('settled', 'completed', 'captured', 'authorized', 'approved') 
    and `order`.fixed_order_id is null 

沒有create view lanciao,我可以運行select塊到最後的罰款。我試圖重構這個,但不能得到它的工作。我應該如何解決這個問題?

我也意識到將這個分隔到不同的視圖並且互相引用,但我不會喜歡這種方式。

+0

在另一個視圖中分隔每個子查詢。 – Melon 2015-04-01 10:24:51

回答

0

MySQL docs狀態:

Before MySQL 5.7.7, the SELECT statement cannot contain a subquery in the FROM clause.

如果你可以升級到MySQL 5.7.7+,那麼你應該能夠做你想要做什麼。

否則,你可能想嘗試創建子查詢的視圖,然後使用您的FROM

所以不是你的SQL可能看起來像:

create view subquery_view as 
    select order_id, sum(quantity) total_quantity 
    from order_items 
    group by order_id 

create view lanciao as 
    select 
    subtime(payment.created_at, '0 5:0:0') as transaction_date, 
    `order_item`.total_quantity, 
    payment.amount as amount, 
    `order`.payment_type 
    from payments payment 
    join orders `order` on `order`.id = payment.order_id 
    left join donation_items donation on donation.order_id = `order`.id 
    inner join subquery_view as `order_item` on `order`.id = `order_item`.order_id 
    where payment.payment_state in ('settled', 'completed', 'captured', 'authorized', 'approved') 
    and `order`.fixed_order_id is null 

要知道這裏面相互嵌套的觀點可能會導致性能問題,但我不知道另外的辦法。

+0

對不起,我忘了提及,我不想創建單獨的視圖。 – Victor 2015-04-01 14:49:51

+0

然後,正如文檔所述,你被搞砸了。您的其他選擇是轉換您的數據庫,將子查詢提取到客戶端,並將它們一起存儲在客戶端的內存中,或者使用另一個RDBMS在視圖中支持FROM內的子查詢。在我看來,它們都是比嵌套視圖更差/更痛苦的選擇,但這取決於你。 – ydaetskcoR 2015-04-01 14:55:04

+0

如果將MySql更新爲MySql 5.7是一個選項,則解除此限制。 「在MySQL 5.7.7之前,SELECT語句不能在FROM子句中包含子查詢。」來源:http://dev.mysql.com/doc/refman/5.7/en/create-view.html – 2015-04-01 15:01:04

相關問題