나는 다음과 같은 테이블이 임시 테이블을 제거합니다. ApproverId와 일치하는 모든 행을 검색해야합니다 (충분히 간단 함). 그리고 내가 가져온 모든 리소스에 대해 승인 된 ID가 전달되지 않은 시간 (동일한 테이블)을 가져와야합니다 (비즈니스 요구 사항, UI에서 회색으로 표시됨). 내가 지금하고있는 일은 - ApproverId를 기반으로 모든 리소스를 가져 와서 임시 테이블에 저장 한 다음 Resource.Id에서 고유 한 작업을 수행하여 다른 임시 테이블에 저장 한 다음 모든 Resource.Id에 대해 ApproverId가 이 아니고 행이 인 행. 임시 테이블을 사용하는 대신 단일 쿼리로 모두 결합 할 수 있습니까?SQL 쿼리 도움말 -</p> <pre><code>Resource -------------------- Id, ProjectId, Hours, ApproverId Project -------------------- Id, Name </code></pre> <p>입력은 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
더 나은 질문을 이해하는 데 도움이되는 결과를 얻으려는 샘플을 –
죄송합니다. SQL Server 2008 R2를 사용하고 있습니다. 내 절차에서 관련성없는 코드를 제거하고 곧 게시 할 예정입니다. – tempid