0

これを手短にしようとする... 以下のクエリ。

SELECT PriorityDefID, MilestoneDefID, MilestoneName, ContactName, 
IIF(PriorityDefID = 1, (SELECT BonusDaysFH FROM milestone_def WHERE (( MilestoneDefID = IIF(MilestoneDefID = 5, 5, IIF(MilestoneDefID = 6, 6, IIF(MilestoneDefID = 7, 7))) )) ), 
IIF(PriorityDefID = 2, (SELECT BonusDaysFM FROM milestone_def WHERE (( MilestoneDefID = IIF(MilestoneDefID = 5, 5, IIF(MilestoneDefID = 6, 6, IIF(MilestoneDefID = 7, 7))) )) ),
IIF(PriorityDefID = 3, (SELECT BonusDaysFL FROM milestone_def WHERE (( MilestoneDefID = IIF(MilestoneDefID = 5, 5, IIF(MilestoneDefID = 6, 6, IIF(MilestoneDefID = 7, 7))) )) ) ))) AS BonusDaysAllotted,
StartDate, EndDate
FROM GetPerformance
WHERE (((MilestoneDefID) = 5 Or (MilestoneDefID) = 6 Or (MilestoneDefID) = 7));

私は最終的に MilestoneDefID の値を取得し、それをサブクエリで再利用して、どの BonusDays 列を返すかを決定しようとしています。サブクエリは、5、6、および 7 の各値を渡した結果を含む 3 つの行を返したいと考えています。 BonusDays の正しい数を返します。

4

1 に答える 1

1

unionこのクエリでの使用と言います。

select a.PriorityDefID, a.MilestoneDefID, a.MilestoneName, a.ContactName,
    b.BonusDaysFH as BonusDaysAllotted, a.StartDate, a.EndDate
from GetPerformance a, milestone_def b
where ((a.MilestoneDefID=5) or (a.MilestoneDefID=6) or (a.MilestoneDefID=7))
    and b.MilestoneDefID=a.MilestoneDefID
    and a.PriorityDefID=1
union
select a.PriorityDefID, a.MilestoneDefID, a.MilestoneName, a.ContactName,
    b.BonusDaysFM as BonusDaysAllotted, a.StartDate, a.EndDate
from GetPerformance a, milestone_def b
where ((a.MilestoneDefID=5) or (a.MilestoneDefID=6) or (a.MilestoneDefID=7))
    and b.MilestoneDefID=a.MilestoneDefID
    and a.PriorityDefID=2
union
select a.PriorityDefID, a.MilestoneDefID, a.MilestoneName, a.ContactName,
    b.BonusDaysFL as BonusDaysAllotted, a.StartDate, a.EndDate
from GetPerformance a, milestone_def b
where ((a.MilestoneDefID=5) or (a.MilestoneDefID=6) or (a.MilestoneDefID=7))
    and b.MilestoneDefID=a.MilestoneDefID
    and a.PriorityDefID=3

悲しいことに、これにより 3 つのクエリが作成されますが、Iif がないことでパフォーマンスが向上すると思います。

于 2013-07-19T15:27:01.970 に答える