2012-04-20 68 views
0

我有如下表 -sql查询的帮助 - 试图摆脱临时表

Resource 
-------------------- 
Id, ProjectId, Hours, ApproverId 

Project 
-------------------- 
Id, Name 

输入是ApproverId。我需要检索所有与ApproverId匹配的行(足够简单)。而且对于我找回的每一个资源,我还需要获得他们的审批时间(同一表格),其审批者不是传入的(业务需求,在用户界面中变灰)。我现在正在做的是 - 获取基于ApproverId的所有资源,将它们存储在临时表中,然后在Resource.Id上执行独立操作,将其存储在不同的临时表中,然后为每个Resource.Id获取ApproverId为而非的行通过。我可以将它全部组合在一个查询中,而不是使用临时表吗?

谢谢!

编辑:我正在使用SQL Server 2008 R2。

编辑2:这是我的存储过程。阅读评论后,我稍微改变了逻辑。我们可以摆脱所有的临时表,并使其更快 -

ALTER PROCEDURE GetResourceDataByApprover 
    @ApproverId UNIQUEIDENTIFIER  
AS 
    CREATE TABLE #Table1 
     (
      Id SMALLINT PRIMARY KEY 
         IDENTITY(1, 1) , 
      ResourceId UNIQUEIDENTIFIER 
     )   

    CREATE TABLE #Table2 
     (
      ResourceId UNIQUEIDENTIFIER , 
      ProjectId UNIQUEIDENTIFIER , 
      ProjectName NVARCHAR(1024)   
     ) 

    INSERT INTO #Table1 
      SELECT DISTINCT 
        ResourceId 
      FROM dbo.Resource T 
      WHERE T.ApproverId = @ApproverId 


    DECLARE @i INT 
    DECLARE @numrows INT 
    DECLARE @resourceId UNIQUEIDENTIFIER 

    SET @i = 1 
    SET @numrows = (SELECT COUNT(*) 
        FROM #Table1 
        ) 

    IF @numrows > 0 
     WHILE (@i <= (SELECT MAX(Id) 
         FROM #Table1 
        )) 
      BEGIN 
       SET @resourceId = (SELECT ResourceId 
            FROM #Table1 
            WHERE Id = @i 
           ) 


       INSERT INTO #Table2 
         SELECT 
           T.ResourceId , 
           T.ProjectId , 
           P.Name AS ProjectName 

         FROM dbo.[Resource] T 
           INNER JOIN dbo.Project P ON T.ProjectId = P.ProjectId         
         WHERE T.ResourceId = @resourceId        


       SET @i = @i + 1 
      END 

    SELECT * 
    FROM #Table1 
    SELECT * 
    FROM #Table2 

    DROP TABLE #Table1 
    DROP TABLE #Table2 
+0

请把你当前的代码。看看你试过的东西很有帮助。还有什么RDBMS? – Taryn 2012-04-20 16:52:31

+0

你想要的那种结果样本可能会帮助你更好地理解这个问题 – 2012-04-20 16:54:14

+0

对不起,我正在使用SQL Server 2008 R2。我将删除我的程序中不相关的代码,并在短期内发布。 – tempid 2012-04-20 16:57:25

回答

1

此查询应返回两行的每一个资源,一个指定的审批,一个用于所有其他审批。

SELECT 
    Id, 
    CASE 
    WHEN [email protected] THEN 'SpecifiedApprover' 
    ELSE 'OtherApprover' 
    END AS Approver, 
    SUM(Hours) AS Hours 
FROM Resource 
GROUP BY 
    Id, 
    CASE 
    WHEN [email protected] THEN 'SpecifiedApprover' 
    ELSE 'OtherApprover' 
    END 
0

您是否想知道具体的Approver如何浪费他的时间?

SELECT p.Id, p.Name, SUM(r.Hours) as TotalHours 
FROM Resource r 
LEFT JOIN Project p 
ON r.ProjectId = p.Id 
WHERE ApproverId = %ConcreteApproverId% 
GROUP BY p.Id, p.Name 
HAVING SUM(r.Hours) > 0 

此查询将产生该表例如:

+-----+----------+-------+ 
| Id | Project | Hours | 
+-----+----------+-------+ 
| 203 | ProjectA | 25 | 
| 202 | ProjectB | 34 | 
| 200 | ProjectC | 46 | 
+-----+----------+-------+