2014-01-06 36 views
0

我有一个以前创建的SQL视图,其中包含我期待得到的数据。它有Case时,它使我难以运行MAX(日期)...我试图运行基于它的视图,它只是保持超时...我可以创建一个新的视图与数据我需要但我仍然需要数据操纵,必须在一些案例中,当我们离开......SQL查看MAX(日期)疯狂

这种观点目前生产这种信息

THDATE    ComponentItemNumber Issued Quantity 
12/23/2013 12:00:00 AM TTMS-12.7-9 19 
12/23/2013 12:00:00 AM TTMS-4.8-9 8.34 
12/23/2013 12:00:00 AM TTMS-4.8-9 10.66 
12/23/2013 12:00:00 AM 44476-3112 2 
12/23/2013 12:00:00 AM M80-0130005 NULL 

我想要做的就是简单地获取最大日期为每项目# 这里是当前视图...有人可以帮我创建一个SQL语句来做到这一点吗?请...我正在使用SQL 2000

SELECT THDATE 
     , CASE WHEN dbo.udf_GetHistoryChar(THBODY + THBODY2 + THBODY3 + THBODY4, 
             7) = 'C' THEN NULL 
      ELSE dbo.udf_GetHistoryVarchar(THBODY + THBODY2 + THBODY3 
              + THBODY4, 10) 
     END AS ComponentItemNumber 
     , CASE WHEN dbo.udf_GetHistoryChar(THBODY + THBODY2 + THBODY3 + THBODY4, 
             3) = 'C' THEN NULL 
      WHEN dbo.udf_GetHistoryChar(THBODY + THBODY2 + THBODY3 + THBODY4, 
             2) = 'D' THEN NULL 
      ELSE dbo.udf_GetHistoryFloat(THBODY + THBODY2 + THBODY3 + THBODY4, 
              17) 
     END AS IssuedQuantity 
FROM dbo.Mfg_TRANHIS AS T1 
WHERE (THTRID = 'PICK') 
     AND (THFLAG = '1') 
     AND (dbo.udf_GetHistoryChar(THBODY + THBODY2 + THBODY3 + THBODY4, 1) = 'C') 
     AND (NOT ((CASE WHEN dbo.udf_GetHistoryChar(THBODY + THBODY2 
                 + THBODY3 + THBODY4, 7) = 'C' 
          THEN NULL 
          ELSE dbo.udf_GetHistoryVarchar(THBODY + THBODY2 
                  + THBODY3 + THBODY4, 
                  10) 
         END) LIKE 'CU%') 
      ) 
     AND (NOT ((CASE WHEN dbo.udf_GetHistoryChar(THBODY + THBODY2 
                 + THBODY3 + THBODY4, 2) LIKE '[MP]' 
          THEN dbo.udf_GetHistoryVarchar(THBODY + THBODY2 
                  + THBODY3 + THBODY4, 
                  4) 
          WHEN dbo.udf_GetHistoryChar(THBODY + THBODY2 
                 + THBODY3 + THBODY4, 3) = 'C' 
          THEN dbo.udf_GetHistoryVarchar(THBODY + THBODY2 
                  + THBODY3 + THBODY4, 
                  5) 
          WHEN dbo.udf_GetHistoryChar(THBODY + THBODY2 
                 + THBODY3 + THBODY4, 2) = 'D' 
          THEN dbo.udf_GetHistoryVarchar(THBODY + THBODY2 
                  + THBODY3 + THBODY4, 
                  5) 
          WHEN dbo.udf_GetHistoryChar(THBODY + THBODY2 
                 + THBODY3 + THBODY4, 7) = 'C' 
          THEN dbo.udf_GetHistoryVarchar(THBODY + THBODY2 
                  + THBODY3 + THBODY4, 
                  4) 
          ELSE dbo.udf_GetHistoryVarchar(THBODY + THBODY2 
                  + THBODY3 + THBODY4, 
                  4) 
         END) LIKE 'VM%') 
      ) 
+0

请格式化您的问题,并将其减少到非常严重的问题。 –

+0

所有这些udf's,CASE语句,而不是?在尝试保释水之前,您可能应该修补漏洞(即修复您的数据模型)。 –

+0

标量值函数在SQL Server中声名狼借。这不太好,但使用表值函数可以极大地提高性能。 – 2014-01-06 17:20:40

回答

0

如果我理解正确,您问的是如何克服超时问题。

我已经经历过这个以及到目前为止我提出的最好的解决方案是将数据推入基于起始视图的表格。然后根据该表创建第二个视图。然而,这要求我有固定的时间(在某些情况下每30分钟)一个存储过程会为我执行此操作,这可能对您无效。

我发现的其他一些工作是在格式化之前限制我使用的数据量。同时确保你正在使用的桌子上有正确的键/索引。

+0

这就是我最终做的事......我去创建一个程序,但我还没有明确指出......谢谢 – Mebaby333