我有一个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
谢谢
答案 0 :(得分: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的方式编写联接,我想你会注意到这一点。
我希望有所帮助。
灰
答案 1 :(得分:1)
OR NAME IN('我的公司\默认组','我的公司\布朗克斯')
应该工作。
当您拥有AND NAME ='我的公司\默认组'时 OR NAME ='我的公司\布朗克斯'不在括号中或使用IN子句,这意味着它将获得满足OR条件的所有内容,忽略所有其他条件。