SQL Server 2008 mise à Jour de la Requête avec Jointure et la clause where dans la table jointe
Ne sais pas pourquoi cela ne fonctionne pas:
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)
En clair, je suis en train de mettre la isUnsubscribed
champ de désabonné où la userID
dans le UserSetting
tableau est égale à la userID
dans la table user et où la emailAddress
dans la table utilisateur n'est pas dans une liste d'e-mails à partir d'une autre table. Je peux courir un select sur la isUnsubbed colonne en utilisant à peu près la même syntaxe et il fonctionne bien? merci!
P. S. j'ai regardé d'autres questions similaires ici et la syntaxe semble le même, mais évidemment, je suis en manque de quelque chose.
- pourquoi il ne fonctionne pas ? avez-vous un message d'erreur (si oui, quel est le message?) ou vous n'avez pas les résultats escomptés (si oui, quels sont les résultats obtenus ?)?
- Désolé excellente question! Il n'a pas d'analyser la requête..
- appuyez sur entrée par erreur. Colonne ou de l'expression 'isUnsubscribedFromSystemEmails' ne peut pas être mis à jour. Les colonnes existe et est accessible en écriture.. pas de problème d'autorisations.. et puis je reçois quelques autres trucs et le message d'erreur : nom d'objet non valide 'ust'. UserSetting table existent, c'est certain! Sélectionnez en utilisant les mêmes joindre et où la clause donne des résultats corrects
- où la
emailAddress
dans la table utilisateur est pas dans une liste d'e-mails à partir d'une autre table" - voulez-vous direBadEmailAddresses
, et si oui, voulez-vous dire "et où l'emailAddress
dans la table user est dans une liste d'e-mails à partir deBadEmailAddresses
"? - Juste un commentaire concernant le nom de la colonne 'isUnsubscribedFromSystemEmails'. En plus d'être un peu long, j'essaie d'éviter les noms. Je préfère quelque chose comme "SendSystemEmails'
- salut Paul, je trouve que vous ne pouvez jamais être assez explicite avec les noms. Ce que ne pas le rendre agréable et descriptif? Comme les noms des entités cela aide les développeurs à comprendre ce que les propriétés n'sans deviner. Comme pour le négatif noms. je suis d'accord.. mais dans ce cas, il est négatif si ils unsub! ;')
Vous devez vous connecter pour publier un commentaire.
Bien que la mise à JOUR...DE la syntaxe est essentielle dans certaines circonstances, je préfère utiliser des sous-requêtes, chaque fois que possible. Est-ce à faire ce que vous avez besoin?
Yep vous avez oublié quelque chose.
L'instruction set ne peut pas faire référence à l'alias sur le côté gauche de l'ensemble.
Essayer:
J'ai ajouté le commentaire sur sélectionner de sorte que vous pouvez vérifier que vous aregetting les résultats que vous vouliez.
Essayez ceci :
Essayer:
Note: Juste pour l'enregistrement (en supposant que vous obtenez tout le reste fonctionne), vous pouvez aussi faire une jointure interne sur la
BadEmailAddresses
table.Si vous avez des problèmes de performances, alors vous pouvez indexer le
emailAddress
colonne dans les deux tables.INNER JOIN
est moins performant qu'une sous-requête lorsque la sous-requête est concis comme celui de la question. Plus d'extension approprié à ce serait à son tour[User]
dans une vue qui a couru la sous-requête dans laWHERE
clause.