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

PL/SQL Oracle Discussion :

Lister les combinaisons possible


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2018
    Messages : 12
    Points : 0
    Points
    0
    Par défaut Lister les combinaisons possible
    Bonjour

    je tourne un peu en rond car je débute un peu, faut bien un jour

    J'ai une table avec 2 colonnes A et B qui ont ces données :

    A | 1
    A | 2
    A | 3
    A | 4
    B | 5
    B | 6
    C | 7
    D | 8
    D | 9
    etc ......

    j'aimerai obtenir

    A 1 2
    A 1 3
    A 1 4
    A 2 1
    A 2 3
    A 2 4
    A 3 1
    A 3 2
    A 3 4
    A 4 1
    A 4 2
    A 4 3
    B 5 6
    B 6 5
    D 8 9
    D 9 8

    Donc pour chaque code de la colonne A, je dois avoir toutes les possibilités. Par exemple pour le code B, j'ai 2 lignes (5 et 6) dans la colonne B je doit donc avoir le résultat 5 | 6 et 6 | 5

    Par exemple A c'est Plaquettes de frein et les données 1 à 4 ce sont des référence de fournisseurs compatibles entre eux. Donc quand je chercherai la ref 1 cela me proposera les ref 2,3 et 4 aussi vu que j'aurai 1 | 2, 1 | 3 et 1 | 4 de défini.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 778
    Points
    30 778
    Par défaut
    C'est tout bêtement un produit cartésien dont on retire les doublons...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select  tb1.col_a
        ,   tb1.col_b
        ,   tb2.col_b
    from    matable tb1
        inner join
            matable tb2
            on  tb1.col_a   = tb2.col_a
            and tb1.col_b  <> tb2.col_b
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2018
    Messages : 12
    Points : 0
    Points
    0
    Par défaut
    Bonjour et merci

    Je n'ai qu'une table et les différentes valeurs sont dans la même colonne

    et je ne veux pas avoir 1 | 5 car 1 est une ref de l'article A et 5 de l'article B
    et en plus de faire remonter 1 | 2, il faut aussi 2 | 1

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 778
    Points
    30 778
    Par défaut
    Et la requête que je proposais ne répond pas au besoin ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2018
    Messages : 12
    Points : 0
    Points
    0
    Par défaut
    Il faut 2 tables pour faire une jointure.

    C'est une sorte de produit cartesien mais sur une meme colonne, uniquement sur les données de la colonne B ayant la même donnée A

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 778
    Points
    30 778
    Par défaut
    Citation Envoyé par 20cils Voir le message
    Il faut 2 tables pour faire une jointure.
    Ou 2 alias pour la même table
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Faut tester le code fourni

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    WITH MATABLE  AS (
    					SELECT 'A' col_a, 1 col_b FROM dual
    UNION ALL SELECT 'A' col_a, 2 col_b FROM dual
    UNION ALL SELECT 'A' col_a, 3 col_b FROM dual
    UNION ALL SELECT 'A' col_a, 4 col_b FROM dual
    UNION ALL SELECT 'B' col_a, 5 col_b FROM dual
    UNION ALL SELECT 'B' col_a, 6 col_b FROM dual
    UNION ALL SELECT 'C' col_a, 7 col_b FROM dual
    UNION ALL SELECT 'D' col_a, 8 col_b FROM dual
    UNION ALL SELECT 'D' col_a, 9 col_b FROM dual)
    SELECT  tb1.col_a, tb1.col_b, tb2.col_b
    FROM MATABLE tb1
    		INNER JOIN MATABLE  tb2 ON tb1.col_a = tb2.col_a AND tb1.col_b  <> tb2.col_b
    order by 1,2,3
    Résultat
    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
    COL_A	COL_B	COL_B_1
    A	1	2
    A	1	3
    A	1	4
    A	2	1
    A	2	3
    A	2	4
    A	3	1
    A	3	2
    A	3	4
    A	4	1
    A	4	2
    A	4	3
    B	5	6
    B	6	5
    D	8	9
    D	9	8
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2018
    Messages : 12
    Points : 0
    Points
    0
    Par défaut
    j'ai 24 000 lignes dans la table ca va etre long

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 088
    Points : 38 393
    Points
    38 393
    Billets dans le blog
    9
    Par défaut
    Il y a un moment où il est bon de tester les solutions proposées, sans quoi les contributeurs finissent par se lasser...

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2018
    Messages : 12
    Points : 0
    Points
    0
    Par défaut
    C’est pas que je ne veux pas mais je n’ai pas de tb2, je n’ai pas de ABCDE mais des milliers de lignes, je n’ai pas de 123456789 mais 24000 lignes.
    Si je laisse du tb2 j’ai de l’identificateur non valide

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 814
    Points
    17 814
    Par défaut
    Si vous n'aimez pas les jointures, vous pouvez faire comme ceci :
    Données
    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
    create table matable
    ( col_a     char(1)
    , col_b     number(1)
    );
     
    insert into matable (col_a, col_b)
    select 'A', 1 from dual union all
    select 'A', 2 from dual union all
    select 'A', 3 from dual union all
    select 'A', 4 from dual union all
    select 'B', 5 from dual union all
    select 'B', 6 from dual union all
    select 'C', 7 from dual union all
    select 'D', 8 from dual union all
    select 'D', 9 from dual;
     
    commit;
    Requête
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    with cte_matable as
    (
    select col_a
         , col_b
         , min(col_b) over(partition by col_a) as col_b_min
         , max(col_b) over(partition by col_a) as col_b_max
      from matable
    )
         select col_a
              , col_b
              , col_b_min + level - 1   as col_c
           from cte_matable
          where col_b_min + level - 1   <> col_b
     connect by prior col_a              = col_a
            and prior col_b              = col_b
            and prior dbms_random.value is not null
            and col_b_max - col_b_min   >= level - 1
       order by col_a, col_b, col_c;
     
    COL_A  COL_B  COL_C
    -----  -----  -----
        A      1      2
        A      1      3
        A      1      4
        A      2      1
        A      2      3
        A      2      4
        A      3      1
        A      3      2
        A      3      4
        A      4      1
        A      4      2
        A      4      3
        B      5      6
        B      6      5
        D      8      9
        D      9      8

  12. #12
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 135
    Points : 1 913
    Points
    1 913
    Par défaut
    Bonjour,

    C'est peut-être parce que tu n'as pas lu le point 5) des règles du forum SQL, dont le lien est donné dans la signature de al1_24.
    Idéalement il faut fournir l'ordre DDL de création de ta table avec un petit jeu de données significatif. Ici tb2 c'est juste le 2è alias utilisé pour faire le join sur ta table. Si tu remplaces MATABLE par le nom de ta vraie table et les colonnes par le nom de tes vraies colonnes la requête devrait fonctionner.

  13. #13
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 814
    Points
    17 814
    Par défaut
    Citation Envoyé par 20cils Voir le message
    je n’ai pas de ABCDE mais des milliers de lignes, je n’ai pas de 123456789 mais 24000 lignes.
    24000 lignes ce n'est rien du tout - même si votre serveur de base de données avait 20 ans.

    Edit : je mets un peu d'eau dans mon vin, c'est la largeur des intervalles que vous souhaitez propager qui va être le point limitant.
    Si c'est 10, ça ira, si c'est 1 million effectivement vous allez avoir un problème mais dans ce cas c'est votre solution complète qu'il faudra revoir.

    Citation Envoyé par 20cils Voir le message
    Si je laisse du tb2 j’ai de l’identificateur non valide
    Vous devez comprendre que nous n'avons pas accès à votre base de données et qu'on a fait ici une interprétation de votre problème avec le jeu de données que vous nous avez fourni.
    Il vous faut bien entendu faire la transposition inverse de la solution avec vos vraies tables et colonnes.

  14. #14
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Il est aussi possible que le WITH ait perturbé.
    Le WITH permet de générer à la volée une vue temporaire avec des données (équivalent des ordres CREATE TABLE, INSERT), donc bien sûr cette partie n'est pas à reprendre avec la vraie table.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  15. #15
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2018
    Messages : 12
    Points : 0
    Points
    0
    Par défaut
    Je ne dis pas que c’est beaucoup, je dis que je ne peux pas faire un script en écrivant moi même les milliers de référence à la place de ABCD et les 24000 à la place de 123456789

    Le résultat est bon mais il a été fait en utilisant de la donnée à l’intérieur du script.

  16. #16
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2018
    Messages : 12
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Bonjour,

    C'est peut-être parce que tu n'as pas lu le point 5) des règles du forum SQL, dont le lien est donné dans la signature de al1_24.
    Idéalement il faut fournir l'ordre DDL de création de ta table avec un petit jeu de données significatif. Ici tb2 c'est juste le 2è alias utilisé pour faire le join sur ta table. Si tu remplaces MATABLE par le nom de ta vraie table et les colonnes par le nom de tes vraies colonnes la requête devrait fonctionner.
    Si si j’ai bien tout remplacé

  17. #17
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2018
    Messages : 12
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par McM Voir le message
    Il est aussi possible que le WITH ait perturbé.
    Le WITH permet de générer à la volée une vue temporaire avec des données (équivalent des ordres CREATE TABLE, INSERT), donc bien sûr cette partie n'est pas à reprendre avec la vraie table.
    Merci pour l’explication

    Peut être, je testerai avec le create de waldar pour voir ce que cela donne.

  18. #18
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 814
    Points
    17 814
    Par défaut
    Citation Envoyé par 20cils Voir le message
    Peut être, je testerai avec le create de waldar pour voir ce que cela donne.
    Le create table c'est pour simuler le jeu de données que vous avez fourni au premier message.
    Vous n'en n'avez pas besoin.

  19. #19
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2018
    Messages : 12
    Points : 0
    Points
    0
    Par défaut
    Bin oui, j’avais pas fait le rapprochement avec le with, j’étais parti sur la création d’une table intermédiaire, avec l’Internet KO et le téléphone ça m’a pas aidé.

    Je pars demain sur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT  tb1.REF_STOCK, tb1.REF_FOURNISSEUR, tb2.REF_FOURNISSEUR
    FROM STOCK tb1
    		INNER JOIN STOCK tb2 ON tb1.REF_STOCK = tb2.REF_STOCK AND tb1.REF_FOURNISSEUR  <> tb2. REF_FOURNISSEUR
    order by 1,2,3
    On verra si il prend bien les 2 alias sur ma table STOCK.

  20. #20
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Mai 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2018
    Messages : 12
    Points : 0
    Points
    0
    Par défaut
    Hello

    J'ai un peu lutté pour mettre tout ça dans un insert into (sequence, valeurs fixes) mais c'est tout bon

    merci

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/01/2013, 12h32
  2. Réponses: 16
    Dernier message: 20/10/2006, 17h31
  3. trouver les combinaisons possibles d'un tableau ?
    Par titoumimi dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 20/09/2006, 21h29
  4. toutes les combinaisons possibles
    Par marocleverness dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 29/05/2006, 01h11
  5. Sortir d'un tableau les combinaisons possibles
    Par juelo dans le forum Algorithmes et structures de données
    Réponses: 33
    Dernier message: 26/03/2006, 18h11

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