2012-04-20 30 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 | 
+-----+----------+-------+