我有如下表 -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
請把你當前的代碼。看看你試過的東西很有幫助。還有什麼RDBMS? – Taryn 2012-04-20 16:52:31
你想要的那種結果樣本可能會幫助你更好地理解這個問題 – 2012-04-20 16:54:14
對不起,我正在使用SQL Server 2008 R2。我將刪除我的程序中不相關的代碼,並在短期內發佈。 – tempid 2012-04-20 16:57:25