2012-11-11 89 views
1

如果在日誌中發現某個用戶標識符違規,我不想更新列。每個條目的SQL更新查詢

UPDATE 
USER_CHECK_LOGIN 
SET 
CHECKLOGIN = 2 
WHERE 
USER_CHECK_LOGIN.USER_ID = (SELECT NAME from XTREME.gamelogs.dbo.LOG_USING_DEPOT201211 WHERE GATENUM=150); 

此查詢所做的是,如果在gatenum爲150的日誌中找到userid,則所有用戶都將被禁止。

但我似乎得到一個錯誤。

Msg 512, Level 16, State 1, Line 2 
Subquery returned more than 1 value. This is not permitted when the subquery follows =,  !=, <, <= , >, >= or when the subquery is used as an expression. 
The statement has been terminated. 

回答

2

相反的=,使用IN(),由於子查詢預計返回多行。使用=與子查詢返回值進行比較時,假定只返回一列和一列。

USER_CHECK_LOGIN.USER_ID IN (SELECT NAME from XTREME.gamelogs.dbo.LOG_USING_DEPOT201211 WHERE GATENUM=150); 
+0

此查詢過禁止所有帳戶。 O_O OMG。 – user1553142

+0

(23520行受影響) 應該隻影響1,因爲log_using_depot目前只有1個條目... – user1553142

+0

@ user1553142這就是你的描述所說的應該做的,不是? –

1

使用IN

UPDATE 
USER_CHECK_LOGIN 
SET 
CHECKLOGIN = 2 
WHERE 
USER_CHECK_LOGIN.USER_ID IN (SELECT NAME from XTREME.gamelogs.dbo.LOG_USING_DEPOT201211 WHERE GATENUM=150); 
+0

你好,但這個查詢禁止了所有的帳戶O_O – user1553142

+0

(23520行受影響) 應該隻影響1. O_O – user1553142

+1

它做你所要求的:「這個查詢所做的是,如果在日誌中找到用戶標識那裏的門票是150,**所有用戶***將被禁止。「如果這是你想要的,那麼內部選擇LOG_USING_DEPOT201211將返回所有userIds,其中getnum爲150.然後,您要將這些用戶的checklogin值設置爲2,對不對? – alzaimar

2

你能避免子查詢完全使用加入:

UPDATE UCL 
SET 
CHECKLOGIN = 2 
FROM 
USER_CHECK_LOGIN UCL 
JOIN 
XTREME.gamelogs.dbo.LOG_USING_DEPOT201211 LUD 
    ON LUD.NAME = UCL.USER_ID 
WHERE 
LUD.GATENUM=150;