IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Select sur une table avec ajout de valeur tirée aléatoirement d'une autre table


Sujet :

SQL Oracle

  1. #1
    Membre régulier Avatar de H.ile
    Profil pro
    Architecte de système d'information
    Inscrit en
    Janvier 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Janvier 2008
    Messages : 122
    Points : 76
    Points
    76
    Par défaut Select sur une table avec ajout de valeur tirée aléatoirement d'une autre table
    Aloha,

    J'ai une table A dans laquelle figurent des champs nominatifs. Je souhaite pouvoir anonymiser ces valeurs en piochant "au hasard" des valeurs dans une table B, remplie par mes soins de valeurs au hasard.
    La table A ressemble à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    SELECT IDENT_PCI,
           CCOCOM,
           CCOSEC,
           DNUPLA,
           "ID Propriétaire",
           "Numéro d'ordre",
           "Code cdif",
           "Nature du droit",
           "sigle de personne morale ",
           "forme juridique abrégée majic2",
           "Propriétaire",
           "Adresse du propriétaire",
           "Résidence du propriétaire",
           CCOPRE,
           "Nature de la personne",
           "Type de personne morale",
           "Avis d'imposition",
           "Type de personne",
           INDIVISION
      FROM MABASE.VUE_PROPRIO_PARCELLE_BATIE;
    Et ma table B à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT NUMERO,
           NOM,
           PRENOM,
           ADRESSE,
           "DATE DE NAISSANCE"
    FROM MABASE.NOM_EQUI
    Je sais piocher au hasard un enregistrement de ma table B (merci DBMS_RANDOM), mais je ne vois pas comment construire le select de tous les enregistrements de ma table A avec des tirages au hasard issu de ma table B.

    Quelqu'un a-t'il une piste ?

    D'avance merci,

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Une piste, après tout dépend si tableB a autant de ligne que tableA :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      with ta as (
    select row_number() over(order by dbms_random.value) as rk_a, .... 
      from table_a
    ),
           tb as (
    select row_number() over(order by dbms_random.value) as rk_b, .... 
      from table_b
    )
    select ....
      from ta 
      join tb on rk_b = rk_a
    Ou sinon peut être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select (select numero
              from (select numero from tableb order by dbms_random.value)
             where rownum = 1
           ) as numero, .....
      from tableA
    Par contre, à lire au sujet de dbms_random :
    having fun with dbms_random

    Il est donc probablement préférable de créer une fonction non déterministe qui encapsule l'appel à dbms_random.value.

  3. #3
    Membre régulier Avatar de H.ile
    Profil pro
    Architecte de système d'information
    Inscrit en
    Janvier 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Janvier 2008
    Messages : 122
    Points : 76
    Points
    76
    Par défaut
    Tout d'abord merci pour ces éléments.
    Le problème est que je n'ai pas deux ensembles de même taille.
    Pour résumer je souhaite tirer, avec remise, autant d'enregistrement de ma table B que j'ai d'enregistrements dans ma table A.
    J'ai testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT *
      FROM (SELECT ID,
                   NOM,
                   MAX (RANDOM_ORDER) OVER (PARTITION BY ID) AS M_,
                   RANDOM_ORDER
              FROM (SELECT TRUNC (DBMS_RANDOM.VALUE (1, 102450)) AS RANDOM_ORDER,
                           V."ID Propriétaire" ID,
                           UPPER (E.NOM) NOM
                      FROM (SELECT * FROM MATABLE_A WHERE ROWNUM < 15
                           ) V, MATABLE_B E))
     WHERE M_ = RANDOM_ORDER
    Et si cela fonctionne bien, dès l'instant que je prends tous les enregistrements de MATABLE_A, le serveur semble perdre les pédales.

    EDIT

    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    WITH ta
         AS (SELECT TRUNC(DBMS_RANDOM.VALUE (1,225)) AS rk_a,
                    "ID Propriétaire" AS ID
               FROM MATABLE_A
               ORDER BY DBMS_RANDOM.VALUE (1, 225) ASC),
         tb
         AS (SELECT ROW_NUMBER () OVER (ORDER BY DBMS_RANDOM.VALUE (1,225)) AS rk_b, NOM
               FROM MA_TABLE_B E)
    SELECT ta.*, tb.*
      FROM ta LEFT JOIN tb ON rk_b = rk_a
    Ce qui me donne une répartition semble-t'il aléatoire (la valeur la plus représentée représente 12,6% des cas, et celle la moins, 0,4%).

    Merci.

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/03/2011, 19h50
  2. Remplir une table avec COPY FROM + valeurs
    Par DeLorbe dans le forum Débuter
    Réponses: 2
    Dernier message: 05/02/2010, 19h15
  3. Réponses: 4
    Dernier message: 16/01/2009, 14h30
  4. Réponses: 5
    Dernier message: 12/03/2007, 10h21
  5. SELECT sur un champ avec accent
    Par Bibicmoi dans le forum Requêtes
    Réponses: 6
    Dernier message: 21/08/2005, 12h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo