2010-04-26 9 views
5

Je voudrais vraiment créer une vue.Utilisation d'une table temporaire dans une vue

Je sais que vous ne pouvez pas utiliser les tables temporaires dans les vues MSSQL2005. Sans réécrire le sql, y a-t-il quelque chose d'évident que j'ai raté?

Le plan de sauvegarde consiste à utiliser un proc stocké.

Vive

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 
+1

Je suis sûr que vous pouvez laisser tomber le premier COMMANDE PAR ... –

Répondre

3

HAV vous avez essayé de réécrire cela sans l'utilisation de tables de temp?

Quelque chose comme

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 
+0

génial merci .. –

0

Utilisez l'instruction WITH.

7

Vous pouvez utiliser un 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 

(pourrait modifier la jonction à un droit, mais vous voyez l'idée ...)

+0

très intéressant ... se penchera sur cela aussi ... Astander vous battre par quelques minutes :-) –

Questions connexes