SQL Server 2008 Update Query с предложением Join и Where в объединенной таблице - PullRequest
5 голосов
/ 20 сентября 2010

Не уверен, почему это не работает:

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 значение «Отписаться», где userID в таблице UserSetting равно userID в пользовательской таблице и где emailAddress в пользовательской таблице отсутствует в списке электронных писем из другой таблицы.Я могу запустить select для столбца isUnsubbed, используя почти тот же синтаксис, и он работает нормально?Спасибо!

PS Я посмотрел другие подобные вопросы здесь, и синтаксис выглядит так же, но, очевидно, я что-то упускаю.

Ответы [ 5 ]

10 голосов
/ 20 сентября 2010

Да, вы что-то упустили.

Оператор 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) 

Я добавил закомментированный выбор, чтобы вы могли проверить, что вы получаете результаты, которые вы хотели.

2 голосов
/ 20 сентября 2010

Хотя синтаксис UPDATE ... FROM необходим в некоторых случаях, я предпочитаю использовать подзапросы, когда это возможно. Делает ли это то, что вам нужно?

UPDATE UserSetting
SET isUnsubscribedFromSystemEmails = 1
WHERE userID in (SELECT userID from [User]
                WHERE emailAddress in (SELECT emailAddress FROM BadEmailAddresses))
0 голосов
/ 06 сентября 2012

Примечание: только для записи (при условии, что все остальное работает), вы также можете выполнить внутреннее объединение таблицы BadEmailAddresses.

Если у вас есть проблемы с производительностью, вы можете захотетьиндексировать столбец emailAddress в обеих таблицах.

0 голосов
/ 20 сентября 2010

Попробуйте:

UPDATE  
    UserSetting
SET   
    isUnsubscribedFromSystemEmails = 1 
FROM          
    UserSetting 
INNER JOIN 
    [User] ON UserSetting.userID = [User].userID  
AND  
    [User].emailAddress IN (SELECT emailAddress FROM BadEmailAddresses)
0 голосов
/ 20 сентября 2010

Попробуйте это:

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