2014-12-02 208 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) 

这也可以让你添加额外的实例而不改变你的代码。

相关问题