2012-12-30 64 views
0

可能重複:
How to combine these two SQL statements?如何將這2個SELECT合併爲一個?

我有2個SQL查詢。他們根據變量等於表中的CMSUIDCASUID值獲得計數。否則,他們是完全一樣的。我怎樣才能將它們組合成一個查詢,也許使用CASE語句。

select @cntCM_CNF = count(distinct(c.ID_Case)) 
from dbo.Cases c 
join dbo.vew_CasePersonnelSystemIDs vcps on c.ID_Case = vcps.ID_Case 
join hearings h on c.ID_Case = h.ID_Case 
where vcps.CMSUID = @nSUID 
    and h.HearingDate > getdate() 
    and h.OnCalendar = 1 and h.Scheduled = 1 
    and dbo.fn_HearingConfirmedNoHOs(h.ID_Hearing) < 2 

select @cntCC_CNF = count(distinct(c.ID_Case)) 
from dbo.Cases c 
join dbo.vew_CasePersonnelSystemIDs vcps on c.ID_Case = vcps.ID_Case 
join hearings h on c.ID_Case = h.ID_Case 
where vcps.CASUID = @nSUID 
    and h.HearingDate > getdate() 
    and h.OnCalendar = 1 and h.Scheduled = 1 
    and dbo.fn_HearingConfirmedNoHOs(h.ID_Hearing) < 2 

我不知道如何將它們合併,因爲結果是不同項目的計數。不知道如何做到這一點。

+0

你不應該試試。 'WHERE'子句是不同的,這意味着你將無法確定組合查詢會導致正確的數據被聚合和返回。 – Oded

+1

不錯的發現@marc_s ... – Oded

+0

@marc_s它是相似的 - 事實上,我問過它。但是,解決方案並不相同 – AngryHacker

回答

2

是...

select 
    @cntCM_CNF = count(distinct case when vcps.CMSUID = @nSUID then c.ID_Case else null end), 
    @cntCC_CNF = count(distinct case when vcps.CASUID = @nSUID then c.ID_Case else null end) 
from dbo.Cases c 
join dbo.vew_CasePersonnelSystemIDs vcps on c.ID_Case = vcps.ID_Case 
join hearings h on c.ID_Case = h.ID_Case 
where 
    h.HearingDate > getdate() 
    and h.OnCalendar = 1 and h.Scheduled = 1 
    and dbo.fn_HearingConfirmedNoHOs(h.ID_Hearing) < 2 AND 
    (vcps.CASUID = @nSUID OR vcps.CMSUID = @nSUID) --<<<<added for performance reasons 
+0

+1這就是我的想法。 – BellevueBob

+0

出於性能原因(特別是如果這些列被索引),我會將(vcps.CASUID = @nSUID或vcps.CMSUID = @nSUID)添加到WHERE子句。 –

+0

好的 - 同意 - 我會編輯。我假設這樣做的原因是引擎在評估「SELECT」中的內容之前是否有處理'WHERE'子句的傾向? – whytheq

1

看看UNION是如何工作的。

本質上,您將在一列中選擇一個計數,0,然後在另一列中選擇0。

您可能需要使用UNION ALL

select @cntCM_CNF = count(distinct(c.ID_Case)) AS Col1, 0 As Col2 
from dbo.Cases c 
join dbo.vew_CasePersonnelSystemIDs vcps on c.ID_Case = vcps.ID_Case 
join hearings h on c.ID_Case = h.ID_Case 
where vcps.CMSUID = @nSUID 
    and h.HearingDate > getdate() 
    and h.OnCalendar = 1 and h.Scheduled = 1 
    and dbo.fn_HearingConfirmedNoHOs(h.ID_Hearing) < 2 
UNION ALL 
select 0 as Col1, @cntCC_CNF = count(distinct(c.ID_Case)) AS Col2 
from dbo.Cases c 
join dbo.vew_CasePersonnelSystemIDs vcps on c.ID_Case = vcps.ID_Case 
join hearings h on c.ID_Case = h.ID_Case 
where vcps.CASUID = @nSUID 
    and h.HearingDate > getdate() 
    and h.OnCalendar = 1 and h.Scheduled = 1 
    and dbo.fn_HearingConfirmedNoHOs(h.ID_Hearing) < 2 
+0

這可行,但它並沒有真正將它合併成一個邏輯查詢。我試圖通過遍歷所有這些表格來緩解一些性能問題,而不是兩次。 – AngryHacker

+0

@AngryHacker - 不要認爲將它們結合起來會使它更具性能。您按不同的字段進行篩選,因此應該在每個查詢中使用不同的索引。性能管每個單獨。如果您需要關於*的幫助,請提供所用表格的詳細Schema,以及關於數據的關係和行爲的描述。 – MatBailie

-1

使用Case快於Union All - >因爲它會掃描1次,你的表

Union All Is faster Union - >有沒有檢查取決於您

螺絲Distinct

+0

這不是一個答案,它的評論 – sicKo

+0

「擰'DISTINCT'」......我假定你的意思是把它拿出來;但評論的理由是什麼 - 如果'ID_Case'不是唯一的,那麼我們如何避免使用'DISTINCT'? – whytheq

相關問題