2013-07-19 34 views
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的結果。對於從GetPerformance查詢返回的每一行,我希望它從該行獲取MilestoneDefID,然後進入子查詢並傳遞MilestoneDefID返回正確數量的BonusDays。

回答

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 

不幸的是,這會做三個查詢,但我相信缺少IIF會提高性能。

+0

正是我想要的。謝謝你,先生。 –