代码之家  ›  专栏  ›  技术社区  ›  Dave Mateer

在视图中使用临时表

  •  5
  • Dave Mateer  · 技术社区  · 16 年前

    我很想创建一个视图。

    我知道在mssql2005视图中不能使用临时表。如果不重写SQL,是否有明显的遗漏?

    备份计划是使用存储过程。

    干杯

    select * into #temp from vwIncidents 
    
    SELECT     vwIncidents.incidentcode, employeecode, EMPOS.POS_L4_CDA as areaAtTimeOfIncident
    into #temp1
    FROM         vwIncidents 
    INNER JOIN EMPOS ON vwIncidents.employeecode = EMPOS.DET_NUMBERA 
    WHERE    EMPOS.POS_STARTC <  vwIncidents.incidentdate
    AND      (EMPOS.POS_ENDD > vwIncidents.incidentdate OR EMPOS.POS_ENDD IS NULL)
    order by incidentcode
    
    select #temp.*, #temp1.areaAtTimeOfIncident from #temp
    left outer join #temp1 on #temp.incidentcode = #temp1.incidentcode 
    and #temp.employeecode = #temp1.employeecode
    order by incidentcode
    
    3 回复  |  直到 16 年前
        1
  •  3
  •   Adriaan Stander    16 年前

    你试过不使用临时表重写这个吗?

    类似的东西

    select  temp.*, 
            temp1.areaAtTimeOfIncident 
    from    (
                select * 
                from vwIncidents
            ) temp  left outer join 
            (
                SELECT  vwIncidents.incidentcode, 
                        employeecode, 
                        EMPOS.POS_L4_CDA as areaAtTimeOfIncident 
                FROM    vwIncidents  INNER JOIN 
                        EMPOS   ON vwIncidents.employeecode = EMPOS.DET_NUMBERA  
                WHERE   EMPOS.POS_STARTC <  vwIncidents.incidentdate 
                AND     (   
                            EMPOS.POS_ENDD > vwIncidents.incidentdate 
                            OR EMPOS.POS_ENDD IS NULL
                        )
            ) temp1     on  temp.incidentcode = temp1.incidentcode  
                    and temp.employeecode = temp1.employeecode 
    order by incidentcode 
    
        2
  •  7
  •   Mitch Wheat    16 年前

    您可以使用CTE:

    WITH cteIncidents (incidentcode, employeecode, areaAtTimeOfIncident)
    AS
    (
    SELECT 
        vwIncidents.incidentcode, employeecode, EMPOS.POS_L4_CDA as areaAtTimeOfIncident 
    FROM
        vwIncidents  
    INNER JOIN EMPOS ON vwIncidents.employeecode = EMPOS.DET_NUMBERA  
    WHERE    EMPOS.POS_STARTC <  vwIncidents.incidentdate 
    AND      (EMPOS.POS_ENDD > vwIncidents.incidentdate OR EMPOS.POS_ENDD IS NULL) 
    )
    
    SELECT 
        incidentcode, employeecode, areaAtTimeOfIncident
    FROM 
        cteIncidents 
    left outer join vwIncidents on vwIncidents.incidentcode = cteIncidents.incidentcode  
    and vwIncidents.employeecode = cteIncidents.employeecode 
    ORDER BY
        incidentcode 
    

    (可能需要将联接改为右联接,但您得到了这个主意…)

        3
  •  0
  •   Marcelo Cantos    16 年前

    使用 WITH 语句。