2014-12-02 203 views
0

語句中使用情況下,如果在查詢(SQL 2008)使用情況下,如果在查詢

語句我有,每3個實例的服務器。我正在做其中一個查詢在其上運​​行。部分查詢將過濾每個服務器的ID,即對於server1爲123。

select COUNT(*) from Department Dep 
where Dep.LocationID in 
(1,2,3, -- Server1 
4,5,6, -- Server2 
7,8,9 --Server3 
) 

我可以像上面那樣過濾所有id並獲得結果。由於表格非常大(2 miilon行),因此最好過濾tabel中的內容,即server1的123。雖然它完成所需的時間並沒有太大的區別。

我能做到這一點

if @@SERVERNAME ='Server1' 
    Begin 
    select COUNT(*) from Department Dep 
    where dep.LocationID in 
    (1,2,3) 
    End 

if @@SERVERNAME ='Server2' 
    Begin 
    select COUNT(*) from Department Dep 
    where dep.LocationID in 
    (4,5,6) 
    End 


if @@SERVERNAME ='Server3' 
    Begin 
    select COUNT(*) from Department Dep 
where dep.LocationID in  
    (7,8,9) 
    End 

所以,如果我在Server2上運行上面的查詢,我將只過濾(4,5,6)

我想加入這個結果到另一個查詢因此尋找更好的方法來做到這一點。

感謝

+0

很難說出你在這裏問什麼。你能澄清嗎? – Codeman 2014-12-02 20:47:17

+0

做三個查詢並將結果插入表變量(或臨時表),然後對錶變量進行最終選擇。 – 2014-12-02 20:51:21

+0

對不起,希望它現在更清晰 – Rosebud 2014-12-02 21:05:57

回答

1

您可以在三個條件做您的WHERE子句:

select COUNT(*) from Employee emp 
    where 
    (@@SERVERNAME = 'Server1' AND emp.LocationID in (1,2,3)) 
    OR 
    (@@SERVERNAME = 'Server2' AND emp.LocationID in (4,5,6)) 
    OR 
    (@@SERVERNAME = 'Server3' AND emp.LocationID in (7,8,9)) 
+0

感謝這看起來部分:) – Rosebud 2014-12-02 21:20:49

+0

很高興它的工作 - 雖然公平艾倫的答案是「更好」,因爲添加服務器和/或位置不會要求您更改查詢(如果這是一個問題)。 – 2014-12-02 21:23:03

0

如果你想「堅持」一個結果在所有三個組查詢,你可以存儲在一個臨時表中的輸出(或表變量),然後使用該對象在您的最終查詢。

例子:

CREATE TABLE #ServerOutput (ServerName VARCHAR(20), TotalRecords INT) 

IF @@SERVERNAME = 'Server1' 
    BEGIN 
    INSERT INTO #ServerOutput (ServerName, TotalRecords) 
    SELECT @@SERVERNAME, COUNT(*) AS TotalRecords 
    FROM Employee emp 
    WHERE emp.Location IN (1,2,3) 
    END 

SELECT * FROM #ServerOutput 
1

理想的方式做,這將是把服務器名稱(或相關關鍵)在locations查找表中。那麼你可以很簡單地做到這一點:

select COUNT(*) from Employee emp 
where emp.LocationID in 
(select locationID from locations where server = @@SERVERNAME) 

這也可以讓你添加額外的實例而不改變你的代碼。

相關問題