Erstellen Sie eine Ansicht aus der select-Anweisung, die verwendet mehrere temporäre Tabellen in T-SQL zu entfernen, die Notwendigkeit für die temp-Tabellen
Wir haben eine sehr normalisierte SQL-2005-Datenbank. Das problem ist, dass ich brauche eine Abfrage, die de-normalisiert die Daten und stellt Sie in Aussicht. Derzeit habe ich eine Abfrage, bekommt das gewünschte Ergebnis festlegen, aber ich bin mit drei temporären Tabellen zu tun, und wechseln Sie in eine Ansicht, in Bezug auf die Ausführung der SQL über eine Dritte Partei reporting-software, die wir nicht geben wollen, die Möglichkeit zum erstellen von temporären Tabellen. Da die Ansicht muss ein einzelnes select-Anweisung; ich bitte um Hilfe bei meiner hässlich-Abfrage in einer einzigen select-Anweisung, kann eine Ansicht.
Den Tabellen beteiligt sind:
ModelResults [CustomerID,ModelID,RunDate,Score,ModelResultID(= modelresultsreviewid)]
Customers [CustomerID]
Models [ModelName,ModelID]
Die Ansichten beteiligt sind:
(dies ist die Menge aller ModelResults, dass ein Review -)
vw_exp_review [CustomerID,modelresultsreviewid]
Ihre Beziehung ist wie folgt:
Jeder Kunde hat eine CustomerID; aber nicht unbedingt ein ModelResult oder Abgeben oder entweder
Jedes Modell hat eine ModeID und ModelName
Jeder ModelResult hat eine "CustomerID", ModelID,RunDate,und die Partitur, aber nicht unbedingt eine Überprüfung
Jede Kritik(vw_exp_review) hat eine CustomerID und modelresultsreviewid
Ziel der Abfrage ist zu finden, die CustomerIDs,Noten,Modelle, und RunDates, alle haben die gleiche CustomerID und ModelID wo:
-
Gibt es keine modelResults oder Bewertungen (in dem Fall alle, die zurückgegeben wird, ist ein CustID)
-
Zuletzt Erzielte Modell (Max(RunDate)) regarless der Beurteilung
-
Zuletzt Erzielte Modell (Max(RunDate)) geprüft wurde
Generell gibt es drei Arten von Ausgabe -
-
CustomerID, MostRecentScore,MostRecentReviewedScore -, Modell-und MaxDate
-
CustomerID,MostRecentScore -, Modell-und MaxDate
-
CustomerID
Als heute, ich bin immer noch mit dem folgenden:
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
Beispiel-Ausgabe:
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
Ist nicht die Tatsache, dass es ist gruppiert nach CustomerID behandeln andere Kunden auf dem gleichen Datum? Das ResultSet keine Wiederholungen von Daten, die nicht direkt mit der Rückseite an den entsprechenden Kunden.
Ja, es finden die anderen Kunden auf dem gleichen Datum. Es werden auch andere Kunden auf andere Termine.
InformationsquelleAutor ASheppardWork | 2013-01-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie CTEs statt Ihre temporären Tabellen. Diese können problemlos eingesetzt werden, in einer Ansicht kombinieren Sie Ihre Abfragen in einer, zB:
SQL-Fiddle nicht befestigt und daher nicht getestet, da keine demo-Daten in OP.
Sich der Tatsache bewusst sein, dass allgemeiner Tabellenausdruck ausgeführt wird, jedes mal, wenn es aufgerufen wird. Sie können auch schreiben Sie eine UDF Rückkehr einer Tabelle mit Ihren Daten. In der Funktion, können Sie immer noch temp-Tabellen wie in OP und erstellen Sie eine Ansicht als
select * from myfunction()
Das war genau das, was ich suchte. Blam mag richtig sein, obwohl, ich kann schlechte Ergebnisse, weil die Gruppierung. Aber ich wollte Ihnen die richtige Antwort, denn Sie haben die Antwort auf meine Frage.
Du bist herzlich willkommen. Ich habe nicht überprüft den code für logische Fehler, wie @JohnySnow getan 😉
InformationsquelleAutor Nico