2010-09-20 1 views
4

Не знаю, почему это не работает:SQL Server 2008 Update Query с регистрацией и где пункт в присоединяемой таблице

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, используя почти такой же синтаксис, и он отлично работает? благодаря!

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

+0

Почему это не работает? у вас есть сообщение об ошибке (если да, то какое сообщение?) или у вас нет ожидаемых результатов (если да, то каковы полученные результаты?)? –

+0

Извините, большой вопрос! Он не анализирует запрос. – toddm

+0

хит введите по ошибке. Колонка или выражение 'isUnsubscribedFromSystemEmails' не могут быть обновлены. Столбцы существуют и доступны для записи .. никаких разрешений не возникает .. и затем я получаю некоторые другие вещи, и сообщение об ошибке: недопустимое имя объекта 'ust'. Таблица UserSetting определенно существует! Выберите, используя одно и то же соединение, и где в предложении приведены правильные результаты – toddm

ответ

1

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

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

это работает. благодаря! Впоследствии обновляет набор дважды, но ... но на данный момент я мог бы заботиться о нем меньше. благодаря! – toddm

10

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

Оператор set не может ссылаться на псевдоним в левой части набора.

Try:

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

+0

выберите * ИЗ UserSetting КАК усть INNER JOIN .userID И [User] [User] ON ust.userID = [User]. emailAddress IN (SELECT emailAddress FROM BadEmailAddresses) отлично работает, кстати! возвращает ожидаемые результаты? – toddm

+0

Если выбор работал нормально, я в недоумении. Почему бы вам не посоветовать нам некоторые образцы данных из пользовательских настроек, User и bademailadressress, и мы можем протестировать данные, которые вы ожидаете. – HLGEM

0

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

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

Я пробовал это .. для одного столбец isUnsubbed находится в таблице ust .. даже с этим изменением запрос не анализируется. – toddm

0

Try:

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

+0

Так что каждый адрес электронной почты пользователя плохой? – HLGEM

0

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

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

+2

На самом деле, 'INNER JOIN' менее результативен, чем подзапрос, когда подзапрос является кратким, как вопрос в вопросе. Более подходящим расширением для этого было бы превратить '[Пользователь]' в представление, которое выполняло подзапрос в предложении 'WHERE'. –