を取り除くためにしようと、私は次のテーブルを持っている -SQLクエリのヘルプ - 一時テーブルの
Resource
--------------------
Id, ProjectId, Hours, ApproverId
Project
--------------------
Id, Name
入力がApproverIdです。私はApproverIdと一致するすべての行を取得する必要があります(十分に単純です)。また、私が戻ってくるすべてのリソースについて、承認された時間が渡される時間(同じテーブル)を取得する必要があります(ビジネス要件、UIでグレー表示される)。私が今やっていることは、ApproverIdに基づいてすべてのリソースを取得し、それらを一時テーブルに格納し、次にResource.Id上で別名を実行し、別の一時テーブルに格納してから、すべてのResource.Idに対してApproverIdがでない行がである行が渡されます。一時テーブルを使用するのではなく、1つのクエリですべてを組み合わせることはできますか?
ありがとうございます!
編集: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