我有如下表 -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