2014-06-12 32 views
0

我有一个SQL语句SQL语句与或从未完成执行,冻结SQL数据库

SELECT dbo.sem_computer.COMPUTER_NAME,dbo.sem_computer.COMPUTER_ID, 
[IP_ADDR1_TEXT],dbo.sem_computer.COMPUTER_DOMAIN_NAME, [ID],dbo.SEM_AGENT.AGENT_VERSION 
FROM sem_computer, [dbo].[V_SEM_COMPUTER], IDENTITY_MAP, SEM_CLIENT,dbo.SEM_AGENT 
WHERE [dbo].[V_SEM_COMPUTER].COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID and dbo.IDENTITY_MAP.ID = dbo.SEM_CLIENT.GROUP_ID 
and dbo.SEM_COMPUTER.COMPUTER_ID = dbo.SEM_CLIENT.COMPUTER_ID 
AND dbo.SEM_COMPUTER.COMPUTER_ID = dbo.SEM_AGENT.COMPUTER_ID 
AND NAME = 'My Company\Default Group' 
OR NAME = 'My Company\Bronx' 
order by [IP_ADDR1_TEXT] 

这无限期执行,甚至冻结当我试图复制并粘贴此代码SQL服务器。

如果我删除

OR NAME = 'My Company\Bronx' 

那么该SQL语句执行就好了

我们使用SQL Server 2008

谢谢

+2

我假设你需要大约2个条件括号:'AND(NAME =“我的公司\默认组” OR NAME =“我的公司\布朗克斯”)' – NickyvV

+1

因为你喜欢的东西交叉连接。请参阅@ NickyvV的建议。 –

回答

2

我认为如果您编写ANSI兼容的T-SQL,整个问题会变得更加清晰。因此,而不是必须在WHERE子句中你能加入条件,你有这样的:

SELECT 
    dbo.sem_computer.COMPUTER_NAME 
, dbo.sem_computer.COMPUTER_ID 
, [IP_ADDR1_TEXT] 
, dbo.sem_computer.COMPUTER_DOMAIN_NAME 
, [ID] 
, dbo.SEM_AGENT.AGENT_VERSION 
FROM 
sem_computer AS COM 
INNER JOIN 
[dbo].[V_SEM_COMPUTER] AS V 
ON 
COM.COMPUTER_ID = V.COMPUTER_ID 
INNER JOIN 
dbo.SEM_CLIENT AS CLI 
ON 
COM.COMPUTER_ID = CLI.COMPUTER_ID 
INNER JOIN 
dbo.SEM_AGENT AS AGT 
ON 
COM.COMPUTER_ID = AGT.COMPUTER_ID 
INNER JOIN 
IDENTITY_MAP AS IM 
ON 
CLI.GROUP_ID = IM.ID 

...

那么你的WHERE子句做什么它是专门做,这是过滤数据。如上所述,这成为

WHERE 
NAME IN('My Company\Default Group','My Company\Bronx') 

性能问题是,正如指出的那样,您正在获得所有表的交叉连接。但是我认为如果你以符合ANSI的方式编写你的联接,你会注意到这一点。

我希望帮助。

+0

我删除了别名,因为它们发出错误,如“多部分标识符”dbo.sem_computer.COMPUTER_NAME“无法绑定。” – Glowie

1

或名称(” My Company \ Default Group','My Company \ Bronx')

应该工作。

当您的AND NAME ='我的公司\默认组' 或NAME ='My Company \ Bronx'不在括号内或使用IN子句时,这意味着它将获得OR条件满足的所有条件,忽略所有其他条件。