Je suis novice en SQL et j'ai été «nominé» pour travailler sur un projet de mise à jour de certains paramètres de compte pour les clients.
Fondamentalement, je dois remplacer un paramètre ("OLDACCESS") par un "NEWACCESS" sur une table user_settings. Cependant, je souhaite uniquement mettre à jour / remplacer "OLDACCESS" par "NEWACCESS" pour un sous-ensemble de nos utilisateurs (les utilisateurs de l'ID d'entreprise 10 qui ont "OLDACCESS". Tous les autres utilisateurs qui ont le "OLDACCESS" doivent rester inchangés.

Les paramètres d'accès sont stockés dans une table user_settings, et les informations de profil de compte de l'utilisateur telles que l'ID de l'entreprise sont stockées dans une table soft_users. Les deux tables sont dans la même base de données.

Heureusement, nous avons une base de données de test sur laquelle je peux m'entraîner avant de faire le changement dans notre système de production. J'ai proposé la requête ci-dessous pour effectuer la mise à jour (de OLDACCESS à NEWACCESS) en utilisant un remplacement, puis en joignant une table "soft_users" pour me permettre de faire une clause where pour trouver les utilisateurs avec l'ID d'entreprise 10 qui ont OLDACCEES. Le problème est que mon script met à jour tous les utilisateurs (avec n'importe quel ID d'entreprise) avec OLDACCESS vers le NEWACCESS, pas seulement les utilisateurs de la société 10 qui ont le OLDACCESS. : [

C'est presque comme si la requête faisait la mise à jour / remplacement mais ignorait totalement la jointure et les sections where. Je suis presque sûr que je fais quelque chose de totalement en phase avec mon débutant. Quelqu'un peut-il m'aider avec des conseils pour montrer où je vais mal?

update user_settings
set access = replace(user_settings.access::varchar, 'OLDACCESS'::varchar, 'NEWACCESS'::varchar)
from soft_users
join user_settings us
on us.user_id = soft_users.user_id
where soft_users.company_id = '10' and us.access like 'OLDACCESS%'

Remarque: je ne sais pas si cela compte mais la base de données est PostgreSQL.

Merci d'avance, Mark

1
reebo 29 août 2020 à 01:10

2 réponses

Meilleure réponse

Vous répétez le tableau dans les clauses FROM et UPDATE.

update user_settings us
    set access = replace(us.access, 'OLDACCESS', 'NEWACCESS')
from soft_users su
where us.user_id = su.user_id and
      su.company_id = 10 and
      us.access like 'OLDACCESS%';

De plus, il ne devrait pas être nécessaire de convertir les constantes de chaîne en chaîne. La même chose est vraie pour us.access.

1
Gordon Linoff 28 août 2020 à 22:12

Juste pour vous donner une autre option:

Vous souhaitez mettre à jour les paramètres utilisateur, mais uniquement ceux pour lesquels l'entreprise de l'utilisateur est 10. La simple déclaration de mise à jour serait donc

update user_settings
  set access = replace(access, 'OLDACCESS', 'NEWACCESS')
where access like 'OLDACCESS%'
and user_id in (select user_id from soft_users where company_id = 10);

C'est ainsi que SQL est censé fonctionner; vous essayez de l'écrire comme vous décririez la tâche en anglais: Mettez à jour les paramètres utilisateur là où certaines conditions sont remplies.

1
Thorsten Kettner 28 août 2020 à 22:24