Tsql 从select语句创建一个视图,该语句在T-SQL中使用多个临时表来消除对临时表的需要

Tsql 从select语句创建一个视图,该语句在T-SQL中使用多个临时表来消除对临时表的需要,tsql,view,temp-tables,Tsql,View,Temp Tables,我们有一个非常规范化的SQL2005数据库。问题是,我需要一个查询来反规范化数据并将其放入视图中。目前,我有一个查询,可以获得所需的结果集;但是我正在使用三个临时表来执行此操作,并且需要切换到一个视图,以便通过第三方报告软件来运行SQL,我们不希望为其提供创建临时表的功能。因为视图需要是单个select语句;我请求帮助将我丑陋的查询转换成一个可以作为视图的select语句 所涉及的表格包括: ModelResults[CustomerID、ModelID、运行日期、分数、ModelResultI

我们有一个非常规范化的SQL2005数据库。问题是,我需要一个查询来反规范化数据并将其放入视图中。目前,我有一个查询,可以获得所需的结果集;但是我正在使用三个临时表来执行此操作,并且需要切换到一个视图,以便通过第三方报告软件来运行SQL,我们不希望为其提供创建临时表的功能。因为视图需要是单个select语句;我请求帮助将我丑陋的查询转换成一个可以作为视图的select语句

所涉及的表格包括: ModelResults[CustomerID、ModelID、运行日期、分数、ModelResultID=modelresultsreviewid]

客户[客户ID]

模型[ModelName,ModelID]

涉及的意见包括: 这是一组具有审阅的所有ModelResults vw\u exp\u review[客户ID、模型结果ReviewID]

他们的关系如下:

每个客户都有一个CustomerID;但不一定是一个模型结果或审查或两者

每个模型都有一个ModeID和ModelName

每个ModelResult都有一个CustomerID、ModelID、RunDate和Score,但不一定有一个Review

每个Reviewvw\u exp\u review都有一个CustomerID和modelresultsreviewid

查询的目标是查找具有相同CustomerID和ModelID的CustomerID、分数、模型和运行日期,其中:

没有modelResults或Reviews,在这种情况下,返回的只是一个CustID

最近评分的模型MaxRunDate无需审查

已审核的最新评分模型MaxRunDate

通常有三种输出

CustomerID、MostRecentScore、MostreCentRevieWebScore、Model和MaxDate

CustomerID、MostRecentScore、Model和MaxDate

客户ID

截至今天,我仍在使用以下工具:

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
样本输出:

CustID,MostRecentScore,MostRecentReviewed,ModelName,MaxDate

8,2.36,4.59,未评分记分卡,2011-08-10 15:08:53.807

1361,2.76,零,设定额定值,2010-04-20 20:48:39.530

1362,NULL,NULL,NULL,NULL

您可以使用它来代替临时表。这些可以很容易地用于将查询组合成一个视图,例如:

CREATE VIEW MYVIEW
AS
    WITH T1
    AS
    (
    -- MostRecentScore
      SELECT CustomerID,ModelID,ModelResultID,RunDate,Min(Score) as MinScore
      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
    )
    ,T2
    AS
    (
      --MostRecentReviewedScore
      SELECT CustomerID,ModelID,RunDate,MIN(Score) AS MinScore
      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
    )
    ,T3
    AS
    ( 
      SELECT c.CustomerID,MAX(RunDATE) as MAXDate
      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
SQL FIDLE未附加,因此未测试,因为OP中没有演示数据


请注意,每次访问CTE时都会执行CTE。您还可以编写一个返回数据表的脚本。在函数中,您仍然可以像在OP中一样使用临时表,并像从myfunction中选择*那样创建一个视图

您知道_T1将匹配另一个客户的最大运行日期吗?按CustomerID分组的事实不是将在同一日期处理任何其他客户吗?结果集没有任何与相应客户不直接相关的日期重复。是的,它将在同一日期找到其他客户。它还会在其他日期找到其他客户;我要试试这个,让你知道我得到了什么,这正是我想要的。尽管责备可能是正确的;我可能会因为分组而得到不好的结果。但是我想给你正确的答案,因为你确实回答了我的问题。不客气。我没有像@JohnySnow那样检查您的代码的逻辑错误;