【问题标题】:Create view with with statement使用 with 语句创建视图
【发布时间】:2017-09-23 15:29:40
【问题描述】:

如何使用 with 语句创建视图? 我遇到了错误:

    WITH temp as (
select uu.email, u.logintime, u.region, p.id as panelid, p.panelname, p.numberofdownloads, dimensionType + ' (' + dimensionValue + ')' as filter
from stat_users u
left join stat_panels p
on u.id=p.sessionid
left join stat_filters f
on p.id=f.panelid
left join users uu
on uu.id=u.userid
where uu.Organization = 'name' AND
     year(logintime) between 2015 and 2017
    and panelname is not  null
)


CREATE VIEW final as(
    select aa.email, aa.logintime, aa.region, aa.panelname, aa.numberofdownloads as downloads, case when len(aa.filters) > 0 then left(aa.filters, len(aa.filters)-1) else '' end as filters
    from (
    Select distinct a.email, a.logintime, a.region, a.panelname, a.numberofdownloads,
                (
                    Select b.filter + ', ' AS [text()]
                    From temp b
                    Where b.panelid=a.panelid
                    ORDER BY b.panelid
                    For XML PATH ('')
                ) filters
    from temp a
    ) aa

) 我收到这样的错误:

> Incorrect syntax near the keyword 'CREATE'. 'CREATE VIEW' must be the
> first statement in a query batch.

所以,我只需要在 Sql server 2014 上使用基于 WITH 语句的 select 创建视图

【问题讨论】:

  • 如果我首先放置创建视图,也会出现错误:

标签: sql sql-server view with-statement


【解决方案1】:

是的,CREATE 必须是查询批处理中的第一条语句

CREATE VIEW vFinal AS 
WITH Temp AS (
SELECT uu.email, u.logintime, u.region, p.id AS panelid, p.panelname, p.numberofdownloads, dimensionType + ' (' + dimensionValue + ')' AS Filter
FROM stat_users u
LEFT JOIN stat_panels p ON u.id=p.sessionid
LEFT JOIN stat_filters f ON p.id=f.panelid
LEFT JOIN users uu ON uu.id=u.userid
WHERE uu.Organization = 'name' AND
                        YEAR(logintime) BETWEEN 2015 AND 2017
                        AND panelname IS NOT  NULL
)
SELECT aa.email, aa.logintime, aa.region, aa.panelname, aa.numberofdownloads AS downloads, CASE WHEN LEN(aa.filters) > 0 THEN LEFT(aa.filters, LEN(aa.filters)-1) else '' end as filters
    FROM (
    SELECT DISTINCT a.email, a.logintime, a.region, a.panelname, a.numberofdownloads,
                (
                    SELECT b.filter + ', ' AS [text()]
                    FROM temp b
                    WHERE b.panelid=a.panelid
                    ORDER BY b.panelid
                    FOR XML PATH ('')
                ) filters
    FROM temp a
    ) aa

GO

使用CTE创建视图表的语法

CREATE VIEW View_Name AS
WITH CTE_Name (Columns) AS (SELECT QUERY)
SELECT QUERY using the CTE Table
GO

【讨论】:

    【解决方案2】:

    with 子句是 select 的可选前缀:

    WITH query_name (column_name1, ...) AS
        (SELECT ...)
    
    SELECT ...
    

    在视图中使用with 时也是如此:

    CREATE VIEW ...
    WITH ...
    SELECT ...
    ;
    

    另请参阅:http://modern-sql.com/feature/with

    【讨论】:

      【解决方案3】:
      CREATE or replace VIEW final as
          select aa.email, aa.logintime, aa.region, aa.panelname, aa.numberofdownloads as downloads, case when len(aa.filters) > 0 then left(aa.filters, len(aa.filters)-1) else '' end as filters
          from (
          Select distinct a.email, a.logintime, a.region, a.panelname, a.numberofdownloads,
                      (
                          Select b.filter + ', ' AS [text()]
                          From temp b
                          Where b.panelid=a.panelid
                          ORDER BY b.panelid
                          For XML PATH ('')
                      ) filters
          from temp a )
      

      【讨论】:

      • 临时声明在哪里?
      • view 的一般语法 .... create view view_name as //Your select statements
      • 抱歉,WITH语句在哪里?
      猜你喜欢
      • 1970-01-01
      • 2012-01-01
      • 2012-02-28
      • 2017-04-17
      • 2020-08-02
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      相关资源
      最近更新 更多