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

Requêtes PostgreSQL Discussion :

SELECT AND ? [11]


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2005
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Services à domicile

    Informations forums :
    Inscription : Septembre 2005
    Messages : 202
    Par défaut SELECT AND ?
    Bonjour,

    J'ai un petit soucis tout bête de select.
    Avec l'exemple de données ci-dessous j'essai de récupérer les archive_id qui ont un document_type_id = 18 et 20 donc archive_id 1 et 6.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    +------------+------------------+
    | archive_id | document_type_id |
    +------------+------------------+
    |          1 |               20 |
    |          1 |               18 |
    |          3 |               20 |
    |          4 |               11 |
    |          2 |               23 |
    |          5 |               20 |
    |          6 |               20 |
    |          6 |               18 |
    +------------+------------------+
    Une idée de la façon d'écrire cela ?
    Merci d'avance.

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

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 371
    Par défaut
    Bonjour,
    Je vois bien une requête de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Select archive_id, count(*) 
    From Latable
    Where document_id in (18,20)
    Group By archive_id
    Having count(*) =2
    Tatayo.

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2005
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Services à domicile

    Informations forums :
    Inscription : Septembre 2005
    Messages : 202
    Par défaut
    Alors, je vais rajouter un détail importantque j'ai oublié :
    J'ai indiqué 18 et 20 pour document_type_id mais il est possible qu'il y ai d'autres valeurs ajoutées à la recherche. Par exemple si je rajoute 23, donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    +------------+------------------+
    | archive_id | document_type_id |
    +------------+------------------+
    |          1 |               20 |
    |          1 |               18 |
    |          3 |               20 |
    |          4 |               11 |
    |          2 |               23 |
    |          5 |               20 |
    |          6 |               20 |
    |          6 |               18 |
    |          6 |               23 |
    +------------+------------------+
    Je dois retrouver que l'archive_id ayant la valeur 6

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 544
    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 544
    Billets dans le blog
    10
    Par défaut
    Si la liste de valeurs à sélectionner peut varier, il faut soit alimenter une table avec ces valeurs, et on ajoutera une jointure sur cette table dans la requête proposée par Tatayo, soit faire du SQL dynamique.

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2005
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Services à domicile

    Informations forums :
    Inscription : Septembre 2005
    Messages : 202
    Par défaut
    Je viens d'avoir une réponse ailleurs et le coup de la table à alimenter fonctionne.
    Voice la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WITH d(document_type_id) AS (VALUES (ARRAY[18,20]))
    SELECT a.archive_id
    FROM archive.archive_document_type AS a CROSS JOIN d
    WHERE a.document_type_id = ANY (d.document_type_id)
    GROUP BY a.archive_id, d.document_type_id
    HAVING count(DISTINCT a.document_type_id) = cardinality(d.document_type_id);

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    J'aurai écris ça comme ceci mais c'est vraiment la même chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      select a.archive_id
        from archive.archive_document_type as a
        join (values(array[18,20,23]))     as d (document_type_id)
          on a.document_type_id = any(d.document_type_id)
    group by a.archive_id, cardinality(d.document_type_id)
      having count(distinct a.document_type_id) = cardinality(d.document_type_id);
    Très bonne utilisation de l'array !

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

Discussions similaires

  1. Select and disappear
    Par noumedem dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 21/05/2014, 08h10
  2. Réponses: 7
    Dernier message: 27/02/2008, 13h55
  3. MySQL : SELECT multitable avec problème de AND
    Par superyan dans le forum Langage SQL
    Réponses: 4
    Dernier message: 21/02/2007, 16h16
  4. OR et AND dans un SELECT
    Par rfleury dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/11/2006, 16h29
  5. SQL :select et AND
    Par Shabata dans le forum Langage SQL
    Réponses: 5
    Dernier message: 20/05/2003, 13h39

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