Association aléatoire d'un rang de table

RPG (3 et 4, free), CL, SQL, etc...
Répondre
PBL
Messages : 16
Enregistré le : ven. 22 nov. 2019, 15:20:16

Association aléatoire d'un rang de table

Message par PBL »

Bonjour,

J'aimerais associer par SQL l'ensemble d'une table (Personnes) avec le rang aléatoirement sélectionné d'une autre table (Prénoms).
Je m'explique : afin d'anonymiser les prénoms de personnes, je compte puiser dans une table des prénoms et les remplacer.
Pour chaque personne (table principale), je veux donc associer un prénom aléatoirement.
J'ai essayé la requête suivante mais elle me donne pour chaque personne le même rang de la table prénom :
select p.idpersonne ,
(SELECT rrn(pr)
FROM PRENOMS pr
ORDER BY rand() FETCH FIRST 1 ROWS ONLY) as RangPrenom
from PERSONNES p ;

Le résultat de cette requête alimente une table temporaire qui me permet ensuite de faire une mise à jour par Update.

Auriez-vous une idée de ce que je dois modifier pour obtenir le résultat souhaité ?

Merci.

vazymimil
Messages : 32
Enregistré le : ven. 28 sept. 2018, 17:14:46

Re: Association aléatoire d'un rang de table

Message par vazymimil »

Bonjour,

Je crois que l'optimiseur ne tient pas compte du caractère non déterministe de rand() et qu'il optimise en réutilisant le même résultat sur chaque recherche de prénom.

Je pense qu'il n'est pas possible d'échapper à une liste de prénom avec chacun une valeur aléatoire qu'on compare à une valeur aléatoire pour chaque personne.

Par exemple cette requête prend la plus proche en valeur absolue :

Code : Tout sélectionner

SELECT idpersonne, rangprenom from (
  SELECT
    idpersonne,
    rownumber() OVER (PARTITION BY idpersonne ORDER BY abs(rand_personne - rand_prenom)) rn,
    rand_personne,
    rand_prenom,
    rangprenom,
    prenom
  FROM
   (SELECT idpersonne, rand() rand_personne FROM PERSONNES p)
    CROSS JOIN (SELECT rrn(prenoms) rangprenom, rand() rand_prenom, prenom FROM prenoms)
 )
WHERE rn = 1;
Nicolas

Répondre