2010-09-20 118 views
4

不知道爲什麼,這是行不通的:SQL Server 2008的更新查詢與加入和Where子句中加入表

UPDATE 
    ust 
SET 
    ust.isUnsubscribedFromSystemEmails = 1 
FROM   
    UserSetting AS ust 
INNER JOIN 
    [User] ON ust.userID = [User].userID 
AND 
    [User].emailAddress IN (SELECT emailAddress FROM BadEmailAddresses) 

用簡單的英語,我想在isUnsubscribed字段設置爲退訂,其中userIDUserSetting表等於用戶表中的userID,並且用戶表中的emailAddress不在另一個表中的電子郵件列表中。我可以使用幾乎相同的語法在isUnsubbed列上運行選擇,它工作正常嗎?謝謝!

P.S.我在這裏看過其他類似的問題,語法看起來相同,但顯然我錯過了一些東西。

+0

爲什麼它不起作用?你是否有錯誤信息(如果有的話,信息是什麼?),或者你沒有預期的結果(如果是的話,獲得的結果是什麼?)? – 2010-09-20 15:23:38

+0

對不起,很好的問題!它不解析查詢.. – toddm 2010-09-20 15:36:30

+0

命中輸入錯誤。列或表達式'isUnsubscribedFromSystemEmails'不能被更新。列存在並且是可寫的..沒有權限問題..然後我得到一些其他的東西,錯誤信息是:無效的對象名稱'ust'。 UserSetting表格絕對存在!選擇使用相同的連接並在where子句中給出正確的結果 – toddm 2010-09-20 15:38:23

回答

1

雖然UPDATE ... FROM語法是在某些情況下必不可少的,我喜歡儘可能使用子查詢。這是否做你需要的東西?

UPDATE UserSetting 
SET isUnsubscribedFromSystemEmails = 1 
WHERE userID in (SELECT userID from [User] 
       WHERE emailAddress in (SELECT emailAddress FROM BadEmailAddresses)) 
+0

這個工程。謝謝!後來更新了兩次雖然..但在這一點上,我可以小心。謝謝! – toddm 2010-09-20 17:09:59

10

是的,你已經忽略了一些東西。

set語句不能引用集合左側的別名。

嘗試:

UPDATE 
    ust 
SET 
    isUnsubscribedFromSystemEmails = 1 
--select * 
FROM   
    UserSetting AS ust 
INNER JOIN 
    [User] ON ust.userID = [User].userID 
WHERE [User].emailAddress IN (SELECT emailAddress FROM BadEmailAddresses) 

我加入了註釋掉選擇,所以你可以檢查看看你aregetting結果設置你想要的。

+0

「無法解析查詢文本」 無效的對象名稱烏斯' – toddm 2010-09-20 15:32:00

+0

選擇* FROM UserSetting AS烏斯 INNER JOIN [用戶] ON ust.userID = [用戶] .userID AND [用戶]。 emailAddress IN(SELECT emailAddress FROM BadEmailAddresses)的工作方式很好!返回預期的結果? – toddm 2010-09-20 15:40:13

+0

如果選擇工作正常,我很茫然。爲什麼不給我們提供一些來自用戶設置,用戶和bademailaddress的示例數據,我們可以根據您所期望的數據進行測試。 – HLGEM 2010-09-20 16:51:21

0

試試這個:

UPDATE UserSetting ust SET usr.isUnsubscribedFromSystemEmails = 1 
WHERE ust.emailAdress IN (select emailAddress from bademailAddresses); 
+0

我試過這個..對於一個isUnsubbed列在ust表中......即使有這個改變,查詢也不會解析。 – toddm 2010-09-20 15:32:34

0

嘗試:

UPDATE 
    UserSetting 
SET 
    isUnsubscribedFromSystemEmails = 1 
FROM   
    UserSetting 
INNER JOIN 
    [User] ON UserSetting.userID = [User].userID 
AND 
    [User].emailAddress IN (SELECT emailAddress FROM BadEmailAddresses) 
+0

這會將UserSetting.isUnsubscribedFromSystemEmails中的每條記錄設置爲true – toddm 2010-09-20 16:41:57

+0

因此,每個用戶的電子郵件都不好? – HLGEM 2010-09-20 16:52:31

0

注:只是爲了記錄(假設你得到的一切工作),你也可以做一個內部聯接上BadEmailAddresses表。

如果您有任何性能問題,那麼您可能需要索引兩個表中的emailAddress列。

+2

實際上,當子查詢簡潔得像問題中的那樣時,「INNER JOIN」的性能比子查詢的性能要差。對此的更適當的擴展是將'[User]'轉換爲在WHERE子句中運行子查詢的視圖。 – 2012-09-26 13:39:34