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 :

2 valeurs sur trois champs possibles, y a-t-il plus simple que le dénombrement de tous les cas possibles ?


Sujet :

SQL Oracle

  1. #1
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 661
    Points : 5 785
    Points
    5 785
    Par défaut 2 valeurs sur trois champs possibles, y a-t-il plus simple que le dénombrement de tous les cas possibles ?
    Bonjour,

    J'ai une table avec trois champ de code possible (cod1,cod2,cod3) qui sont des codes numériques sur trois chiffres.
    J'aimerais obtenir la liste des gens (champ ID) qui ont un code 7xx et un code 180
    La seule option que je vois c'est de dénombrer toutes les possibilités possibles: (cod1 like '7__' and cod2=180) or (cod1 like '7__' and cod3=180) or ...
    Dans cet exemple il n'y a que 6 possibilités donc ce n'est pas encore trop long à écrire, mais si le nombre de champ de code augmente ça devient compliqué...

    Du coup je me demandais si il existe un méthode plus simple pour résoudre ce problème.

    Merci d'avance
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Le mieux ici est de sortir ces colonnes (et non champs) de la table, et de les mettre dans une table liée. La table en question ne contient que 2 colonnes: L'id de la table "mère", et Cod.

    Ainsi la requête devient très simple à écrire:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select T1.id,count(*)
    from TableMere as t1
    inner join TableFille as t2 on t1.id = t2.id
    where t2.code like '7___' or t2.cod = '180'
    group by t1.id
    having count(*) = 2

    Tatayo.

  3. #3
    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
    En concaténant les champs tu peux t'en sortir en 2 conditions

    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
    WITH T AS (SELECT 710 code1, 720 code2, 180 code3 FROM dual
    UNION ALL SELECT 910 code1, 620 code2, 580 code3 FROM dual
    UNION ALL SELECT 910 code1, 620 code2, 180 code3 FROM dual
    UNION ALL SELECT NULL code1, 180 code2, NULL code3 FROM dual
    UNION ALL SELECT 180 code1, 620 code2, 780 code3 FROM dual
    UNION ALL SELECT 180 code1, NULL code2, 780 code3 FROM dual
    UNION ALL SELECT 180 code1, 620 code2, 7800 code3 FROM dual
    )
    SELECT * 
    FROM T
    WHERE ';'|| code1 ||';'|| code2 ||';'|| code3 ||';' LIKE '%;7__;%;180;%'
    OR  ';'|| code1 ||';'|| code2 ||';'|| code3 ||';' LIKE '%;180;%;7__;%'
     
    CODE1	CODE2	CODE3
    710	720	180
    180	620	780
    180		780
    Tu as aussi la solution de l'intersect (mais qui fait un distinct)
    J'ai mis une autre façon de gérer le 7xx (plutôt que de passer par de la transformation en chaîne de caractère)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT code1, code2, code3
    FROM T
    WHERE TRUNC(code1/100) = 7 OR TRUNC(code2/100) = 7 OR TRUNC(code3/100) = 7
    INTERSECT
    SELECT code1, code2, code3
    FROM T
    WHERE code1 = 180 OR code2 = 180 OR code3 = 180
    et en simplifiant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT code1, code2, code3
    FROM T
    WHERE 7 IN (TRUNC(code1/100), TRUNC(code2/100), TRUNC(code3/100))
    INTERSECT
    SELECT code1, code2, code3
    FROM T
    WHERE 180 IN (code1, code2, code3)
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 661
    Points : 5 785
    Points
    5 785
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Bonjour,
    Le mieux ici est de sortir ces colonnes (et non champs) de la table, et de les mettre dans une table liée. La table en question ne contient que 2 colonnes: L'id de la table "mère", et Cod.
    Merci de ta réponse Tatayo

    (Je précise que le SQL n'est pas ma spécialité)
    Je crois qu'on s'est mal compris ou que je ne comprend pas ta réponse
    Je n'ai pas qu'un seule code par ligne mais bien trois, je ne comprends pas comment je pourrais obtenir une table avec l'id et un seul champ de code sans perdre de l'information.
    Je ne comprends pas non plus dans ton code ce que représente TableMere et TableFille


    Edit:
    Merci aussi à McM dont j'ai compris les codes
    Je vais maintenant essayé de les adapter avec mes vraies tables.
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    C'est simple. TableMere représente ta table actuelle, sans les 3 colonnes Code1, Code2, Code3.
    TableFille représente une table avec une colonne qui reprend la clé primaire de TableMere, et une colonne Code.

    Si pour une ligne donnée de TableMere tu as 3 valeurs, alors tu as 3 lignes dans TableFille (une par valeur).

    Imaginons que nous parlions d'une table Client:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Create table Client
    (
    Id Int not null primary key,
    Nom varchar(30),
    Prenom varchar(30)
    )
    J'ajoute donc une table InfoClient:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Create table InfoClient
    (
    Id Int not null primary key
    IdCli int not null,
    Code varchar(3)
    )
    Il faut bien sûr ajouter une clé étrangère entre InfoClient.Idcli et client.Id.

    Pour chaque ligne de Client, tu as autant de ligne de InfoClient que de "code" à enregistrer.
    Ainsi si le nombre de "code" peut varier sans toucher le schéma de ta base, et les extractions sont bien plus simples à coder.
    Exemple si tu veux les clients qui ont au moins 2 codes parmi une liste de 3:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select client.id,count(*)
    from client c
    inner join infoclient i on c.id = i.idcli
    where i.code in ('1','2','3')
    group by i.id
    having count(*) >= 2
    Avec ta modélisation actuelle c'est "un peu" plus complexe à coder.

    Tatayo.

  6. #6
    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
    Mon INTERSECT était une "aberration" .. un simple AND le remplace.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT code1, code2, code3
    FROM T
    WHERE 7 IN (TRUNC(code1/100), TRUNC(code2/100), TRUNC(code3/100))
    AND 180 IN (code1, code2, code3)
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 661
    Points : 5 785
    Points
    5 785
    Par défaut
    @Tatayo
    Super, merci les précisions c'est beaucoup plus clair maintenant
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/08/2018, 15h47
  2. Algorithme de test de tous les cas possibles
    Par g_gau dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 31/07/2014, 21h17
  3. [9.2] Détection de changement de valeurs sur un champ
    Par gorgonite dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 01/03/2013, 11h48
  4. inverser deux valeur sur un champ UNIQUE
    Par gotcha5832 dans le forum Requêtes
    Réponses: 3
    Dernier message: 23/05/2011, 04h23
  5. regroupement de valeurs sur un champs
    Par Sami Xite dans le forum Access
    Réponses: 26
    Dernier message: 16/01/2007, 17h14

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