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ù:
-
Il n'y a pas modelResults ou d'Examens (dans ce cas, tout ce qui est renvoyée est CustID)
-
Le Plus Récemment remporté Modèle (Max(RunDate)) regarless de l'examen
-
Le Plus Récemment remporté Modèle (Max(RunDate)) qui a été examiné
Il existe généralement trois types de sortie
-
CustomerID, MostRecentScore,MostRecentReviewedScore,le Modèle, et MaxDate
-
CustomerID,MostRecentScore,le Modèle, et MaxDate
-
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.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser D'expressions de table communes au lieu de vos tables temporaires. Ceux-ci peuvent être facilement utilisés en vue de combiner vos requêtes en une seule, par exemple:
SQL-Fifre qui n'est pas attachée et donc pas testé, car pas de démo-données dans OP.
Être conscient du fait, que la CTE est exécuté à chaque fois, il est accessible. Vous pouvez également écrire un UDF de retourner un tableau avec vos données. Dans la fonction, vous pouvez toujours utiliser des tables temporaires comme dans l'OP et de créer une vue
select * from myfunction()