2014-06-12 57 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條件滿足的所有條件,忽略所有其他條件。