【问题标题】:How to store query result into temporary table如何将查询结果存储到临时表中
【发布时间】:2015-11-12 14:37:13
【问题描述】:

我正在尝试使用以下查询将 SQL 查询生成的结果插入到临时表中:

SELECT * 
INTO #YourTempTable
FROM
    (WITH cte AS 
     (
        SELECT
            sb.case, sb.Trace, sb.Amount, sp.edge, sp.UserId,
            count(*) over (partition by sp.edge) as cnt
        FROM 
            Budget sb 
        JOIN
            Sap sp ON sb.Trace = sp.Trace
        WHERE 
            sb.Trace IN (SELECT Trace FROM Sap 
                         WHERE sb.UserId in ('R5', 'HB'))
     )
     SELECT cte.*
     FROM cte
     WHERE cnt > 1
     ORDER BY edge DESC;
)

我收到错误:

消息 156,第 15 级,状态 1,第 4 行
关键字“with”附近的语法不正确。

消息 319,第 15 级,状态 1,第 4 行
关键字“with”附近的语法不正确。如果这个语句是一个公用表表达式、一个 xmlnamespaces 子句或一个更改跟踪上下文子句,则前面的语句必须以分号结束。

消息 102,第 15 级,状态 1,第 12 行
')' 附近的语法不正确。

谁能告诉我这件事?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    WITHSELECT 之前:

    with cte as (
          select sb.case, sb.Trace, sb.Amount, sp.edge, sp.UserId,
                 count(*) over (partition by sp.edge) as cnt
          from Budget sb join
               Sap sp 
               on sb.Trace = sp.Trace
          where sb.Trace in (select Trace from Sap where sb.UserId in ('R5', 'HB'))
         )
    SELECT * 
    INTO #YourTempTable
    FROM cte
    WHERE cnt > 1
    ORDER BY edge desc;
    

    请注意:Oracle 支持您的语法 ,但其他数据库不支持。一般来说,WITH 应该在语句的开头。

    另外,子查询是不必要的。实际上,您会得到两个额外的错误:子查询没有别名,并且子查询中不允许使用ORDER BY(除非使用了TOPFETCH FIRST)。

    【讨论】:

    • 反应更快,而且你发现的坏东西比我多。得到我的支持。
    • 它会在数据库中创建一个临时表吗?还是表只是动态创建的?
    • @user2961127 。 . . SQL Server 不会实现 CTE(无论好坏)。逻辑只是合并到执行计划中。
    猜你喜欢
    • 1970-01-01
    • 2020-12-05
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2015-11-12
    • 2015-03-05
    • 2021-11-09
    相关资源
    最近更新 更多