+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Expert Confirmé Avatar de Madfrix
    Profil pro
    Inscrit en
    juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : juin 2007
    Messages : 2 326
    Points : 2 532
    Points
    2 532

    Par défaut Algorithme pour une requête

    Hello,

    Admettons 3 colonnes x, y, z d'une table au format numérique.

    Champs des possibles :

    • x-> [1-9]
    • y-> [1-500]
    • z-> [1-15]


    Ce sont en fait des coordonnées au format (x,y,z). Nous pouvons donc avoir par exemple les coordonnées (2,458,3) ou (1,500,15), etc. Il y a donc au total 9*500*15 = 67500 possibilités.

    Ce que je souhaite faire, c'est trouver toutes les coordonnées "non prises". Par exemple si j'ai 438 coordonnées prises, je souhaite une requête me retournant toutes les 67500-438=67062 coordonnées restantes.

    J'avais déjà fait il y a quelques années une requête de ce style avec une table "témoin" contenant toutes mes coordonnées et je faisais une sorte de MINUS pour trouver les coordonnées restantes.

    Ce que je souhaite savoir, c'est si, pour ce genre de requête, on peut éviter de créer une nouvelle table ? Faire une requête SQL qui elle même génère "en interne" les 67500 possibilités afin de trouver les coordonnées non prises ?

    Merci
    Je ne réponds pas aux questions envoyées par mp

  2. #2
    ced
    ced est actuellement connecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    avril 2002
    Messages
    5 164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : avril 2002
    Messages : 5 164
    Points : 18 122
    Points
    18 122

    Par défaut

    Bonjour,

    Il n'est pas nécessaire de créer une table temporaire pour cela, la fonction generate_series() fait l'affaire.
    Pour générer toutes les combinaisons possibles dans ton cas, la requête suivante suffit de faire :
    Code :
    1
    2
    3
    4
    5
    select x, y, z
    from generate_series(1, 9) as x
    CROSS JOIN generate_series(1, 500) as y
    CROSS JOIN generate_series(1, 15) as z
    order by 1, 2, 3;
    Ne reste plus qu'à faire une jointure externe entre cette première requête et les triplets dont tu disposes, pour ne garder que ce qui n'existe pas :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select t1.x, t1.y, t1.z
    FROM (
        select x, y, z
        from generate_series(1, 9) as x
        CROSS JOIN generate_series(1, 500) as y
        CROSS JOIN generate_series(1, 15) as z
    ) AS t1
    LEFT JOIN ta_table t2 ON t1.x = t2.x AND t1.y = t2.y AND t1.z = t2.z
    WHERE t2.x IS NULL
    ORDER BY t1.x, t1.y, t1.z
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Expert Confirmé Avatar de Madfrix
    Profil pro
    Inscrit en
    juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : juin 2007
    Messages : 2 326
    Points : 2 532
    Points
    2 532

    Par défaut

    Whoo épatant cette petite fonction generate_series() que je ne connaissais pas (mon ancienne requête était faite sous MySQL).

    Je vais pouvoir m'en sortir facilement, tu m'as mâché le travail

    Merci beaucoup !
    Je ne réponds pas aux questions envoyées par mp

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •