簡體   English   中英

視圖的 SELECT 在 FROM 子句中包含子查詢

[英]View's SELECT contains a subquery in the FROM clause

我有兩個表,我需要創建一個視圖。 這些表是:

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)

根據文檔:

MySQL 文檔

  • SELECT 語句不能在 FROM 子句中包含子查詢。

您的解決方法是為每個子查詢創建一個視圖。

然后從您的視圖view_credit_status訪問這些視圖

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)

正如關於 視圖限制的最新 MySQL 文檔所說:

在 MySQL 5.7.7 之前,不能在視圖的 FROM 子句中使用子查詢。

這意味着,選擇 MySQL v5.7.7 或更新版本或將現有 MySQL 實例升級到這樣的版本,將完全取消對視圖的這種限制。

但是,如果您的當前生產 MySQL 版本早於 v5.7.7,那么取消對視圖的這種限制應該只是在決定是否升級時評估的標准之一。 使用其他答案中描述的變通技術可能是更可行的解決方案 - 至少在短期內是這樣。

在我看來,MySQL 3.6 給出了以下錯誤,而 MySQL 3.7 不再出錯。 我還沒有在文檔中找到有關此修復程序的任何內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM