【问题标题】:Create a view from Select statement with multiple subqueries / joins从具有多个子查询/连接的 Select 语句创建视图
【发布时间】:2013-03-06 07:27:24
【问题描述】:

所以我有多个表,我正在尝试创建一个视图来显示我的 select 语句中返回的所有内容。但是似乎mysql不允许创建具有子查询的视图。

所以不太确定如何将其转换为视图。

Select  Title as "AlbumName" , 
        Sum(trk1.Price * trk1.Quant) as "TotalSales"
From    Album alb
        INNER JOIN
        (
            SELECT  AlbumId, 
                    t1.UnitPrice as "Price" , 
                    t1.Quantity as "Quant"
            FROM    Track trk
                    INNER JOIN
                    (
                        SELECT  TrackId, UnitPrice, Quantity
                        FROM    InvoiceLine
                        WHERE   InvoiceId IN ( SELECT InvoiceId FROM Invoice )
                    ) AS t1 ON (trk.TrackId = t1.TrackId)
        ) as trk1 ON (alb.AlbumId = trk1.AlbumId)
Group By alb.AlbumId

【问题讨论】:

    标签: mysql sql join view subquery


    【解决方案1】:

    MySQL 中创建VIEW 非常简单,但有一些限制。 See HERE: MySQL View

    其中一个限制是VIEWs 不能有在 FROM 子句中包含子查询的 SELECT 语句。因此,作为替代方案,首先为包含IN 子句的子查询创建一个视图。

    CREATE VIEW InvoiceLineView
    AS
    SELECT  DISTINCT a.*
    FROM    InvoiceLine a
            INNER JOIN Invoice b
                ON a.InvoiceId = b.InvoiceId;
    

    创建视图后,您现在可以通过从原始查询中加入视图来继续操作,这样您现在就可以创建一个完全可用的VIEW。对于未计算的子查询,您不需要额外的视图。

    CREATE VIEW AlbumSales
    AS
    Select  Title as AlbumName, 
            Sum(t1.UnitPrice * t1.Quantity) as TotalSales
    From    Album alb
            INNER JOIN Track trk
                ON alb.AlbumId = trk1.AlbumId
            INNER JOIN InvoiceLineView t1
                ON trk.TrackId = t1.TrackId
    Group   By alb.AlbumId;
    

    不过,MySQL 中的 VIEWS 很糟糕。

    【讨论】:

      【解决方案2】:

      如果你真的需要它作为视图,你必须先将子查询包装为视图。

      CREATE VIEW vw_sub1 AS
      SELECT TrackId, UnitPrice, Quantity
        FROM InvoiceLine
       WHERE InvoiceId
          IN (SELECT InvoiceId FROM Invoice);
      
      CREATE VIEW vw_sub2 AS
      SELECT AlbumId, t1.UnitPrice Price, t1.Quantity Quant
        FROM Track trk INNER JOIN 
             vw_sub1 t1 ON trk.TrackId = t1.TrackId;
      
      CREATE VIEW vw_main AS
      SELECT Title AlbumName, Sum(trk1.Price * trk1.Quant) TotalSales
        FROM Album alb INNER JOIN
             vw_sub2 trk1 ON alb.AlbumId = trk1.AlbumId
       GROUP BY alb.AlbumId;
      

      代码未经测试

      【讨论】:

        【解决方案3】:

        不幸的是,MySQL 不支持在您的视图中使用这样的子查询。我听说的唯一解决方法是为每个子查询创建单独的视图,然后使用其他视图创建主视图。这有点奇怪,但确实有效。

        在您的情况下,您需要创建 3 个视图 - 2 个用于内部子查询,1 个用于主查询。

        【讨论】:

        • 虽然@sgeddes 是对的——我认为这掩盖了糟糕的表/模式设计。为什么要使用视图?如果您不进行直接数据库查询 - 只需使用表的 UNION。如果表格不是很大,请添加一列并合并表格数据并使用 WHERE....
        • 使用视图是一个糟糕的设计(遗憾的是不是我的选择)并且不确定我将如何从中创建视图(除非我可以在 table2.TrackId 中执行 table1.TrackId
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-05
        • 1970-01-01
        • 2021-11-06
        • 1970-01-01
        • 2023-02-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多