Créer une Vue à partir de l'instruction select qui utilise plusieurs tables temporaires en T-SQL pour supprimer la nécessité pour les tables temporaires

Nous avons une très normalisé SQL 2005 de la base de données. Le problème est que j'ai besoin d'une requête de-normalise les données et le met dans une vue. Actuellement, j'ai une requête qui permet d'obtenir les résultats souhaités; mais je suis à l'aide de trois tables temporaires pour le faire et il faut les passer à un affichage dans le but d'exécuter le SQL par l'intermédiaire d'un tiers, logiciel de déclaration que nous ne voulons pas donner la possibilité de créer des tables temporaires pour. Étant donné que la vue doit être une seule instruction select; je demande de l'aide pour faire mon vilain requête en une seule instruction select qui peut être vue.

Les tables concernées sont:
ModelResults [CustomerID,ModelID,RunDate,Score,ModelResultID(= modelresultsreviewid)]

Customers [CustomerID]

Models [ModelName,ModelID]

Les points de vue sont les suivants:
(c'est l'ensemble de tous les ModelResults qui ont un Examen)
vw_exp_review [CustomerID,modelresultsreviewid]

Leur relation est comme suit:

Chaque Client dispose d'un code de client, mais pas nécessairement un ModelResult ou de l'Examen ou soit

Chaque Modèle possède une ModeID et ModelName

Chaque ModelResult a un code client,ModelID,RunDate,et le Score, mais pas nécessairement un Examen

Chaque Examen(vw_exp_review) a un code client et modelresultsreviewid

L'objectif de la recherche est de trouver le Customerid,les Scores,les Modèles, et RunDates qui ont tous le même code client et ModelID où:

  1. Il n'y a pas modelResults ou d'Examens (dans ce cas, tout ce qui est renvoyée est CustID)

  2. Le Plus Récemment remporté Modèle (Max(RunDate)) regarless de l'examen

  3. Le Plus Récemment remporté Modèle (Max(RunDate)) qui a été examiné

Il existe généralement trois types de sortie

  1. CustomerID, MostRecentScore,MostRecentReviewedScore,le Modèle, et MaxDate

  2. CustomerID,MostRecentScore,le Modèle, et MaxDate

  3. CustomerID

À compter d'aujourd'hui, je suis toujours en utilisant les éléments suivants:

DROP TABLE #_T1
-- MostRecentScore
SELECT CustomerID,ModelID,ModelResultID,RunDate,Min(Score) as MinScore
INTO #_T1
FROM ModelResults m1 WITH (NOLOCK)
WHERE RunDate IN (SELECT MAX(m.RunDate) FROM ModelResults m GROUP BY m.CustomerID)
GROUP BY
CustomerID,ModelID,ModelResultID,RunDate
DROP TABLE #_T2
--MostRecentReviewedScore
SELECT CustomerID,ModelID,RunDate,MIN(Score) AS MinScore
INTO #_T2
FROM ModelResults m1 WITH (NOLOCK)
WHERE RunDate IN (SELECT MAX(RunDate) 
FROM ModelResults t JOIN vw_exp_review r ON 
r.modelresultsreviewid = t.ModelResultID
GROUP BY t.CustomerID)
GROUP BY CustomerID,ModelID,RunDate
DROP TABLE #_T3
--MostRecentModelResultDate
SELECT c.CustomerID,MAX(RunDATE) as MAXDate
INTO #_T3
FROM ModelResults mr WITH (NOLOCK)
RIGHT OUTER JOIN Customers C
ON mr.CustomerID = c.CustomerID
GROUP BY c.CustomerID
SELECT t3.CustomerID,t1.MinScore as MostRecentScore,
t2.MinScore as MostRecentReviewedScore,m.Model as ModelName,
t3.MaxDate
FROM #_T1 t1
LEFT OUTER JOIN #_T2 t2
ON t1.CustomerID = t2.CustomerID AND t1.ModelID = t2.ModelID
RIGHT OUTER JOIN #_T3 t3
ON t1.CustomerID = t3.CustomerID
LEFT OUTER JOIN Models m
ON t1.ModelID = m.ModelID
ORDER BY
t3.CustomerID

Exemple de sortie:

CustID,MostRecentScore,MostRecentReviewed,ModelName,MaxDate

8,2.36,4.59,Unrated Scorecard,2011-08-10 15:08:53.807

1361,2.76,NULL,SET Rated,2010-04-20 20:48:39.530

1362,NULL,NULL,NULL,NULL

  • Vous savez que #_T1 correspondra max RunDate sur un autre client?
  • N'est-ce pas le fait qu'il est regroupées par code client va gérer tout les autres clients sur le même jour? Le jeu de résultats n'ont pas de répétitions de dates ne sont pas liées directement aux clients.
  • Oui, il va trouver d'autres clients sur le même jour. Il permettra également de trouver d'autres clients sur d'autres dates.