我有以下表格 -
Resource
--------------------
Id, ProjectId, Hours, ApproverId
Project
--------------------
Id, Name
输入是 ApproverId。我需要检索所有匹配 ApproverId 的行(足够简单)。对于我返回的每个资源,我还需要获取他们的小时数(同一张表),其批准者 ID 不是传入的(业务需求,在 UI 中显示为灰色)。我现在正在做的是 - 根据 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