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

Langage SQL Discussion :

[ACCESS] SELECT "élaboré"


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 68
    Points : 33
    Points
    33
    Par défaut [ACCESS] SELECT "élaboré"
    Bonjour, je sollicite encore une fois votre aide car comme pouvait dire les romain : je perd mon SQL!


    J'aimerai faire une requête sur ma table "Table_Suivi_Etat" Qui ne ressort que la colonne "ID_Etat" pour chaque "ID_Formulaire" ou "Date_Debut_Etat" est le plus grand.

    Autrement dit,

    Je souhaite avoir les ID_Etat le plus récent par ID_Formulaire.

    Pour le moment en reprenant un exemple du Web Je suis arrivé à ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    SELECT ID_Etat
    FROM Table_suivi_Etat
    WHERE EXISTS (ID_Formulaire,Date_Debut_Etat) IN(select ID_Formulaire,   MAX(Date_Debut_Etat)
    From Table_suivi_Etat
    group by ID_Formulaire)
    Cela me permet de récupérer les colonnes ID_Formulaire (Sans doublon) avec la date la plus grande (par ID_Formulaire)

    J'aimerai maintenant ressortir que la colonne ID_Etat correspondant a la selection précédente.

    En suivant le code trouvé sur le WEB je devrais écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT ID_Etat
    FROM Table_suivi_Etat
    WHERE EXISTS (ID_Formulaire,Date_Debut_Etat) IN(select ID_Formulaire,   MAX(Date_Debut_Etat)
    From Table_suivi_Etat
    group by ID_Formulaire)
    ACCES M'indique l'erreur suivante :

    Vous avez écrit une sous_requête pouvant renvoyer plus d'un champ sans utiliser le mot réservé EXISTS dans la clause FROM de la requête Principale. Révisez l'instruction SELECT de la sous-requête pour obtenir un seul champ.


    Si vous avez une idée je suis preneur!!!

    Par la suite je dois insérer cette requete dans une autre :

    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
     
     
    SELECT Table_Formulaire.ID_Formulaire,  Table_Equipement.Nom_Equipement, Table_Ligne.Nom_Ligne, Table_VS.Nom_VS, Table_NatureDemande.Libellé_NatureDemande, Table_NivCompte.Nom_Compte AS 'Compte Actuel', Table_NivCompte1.Nom_Compte AS 'Compte Souhaité', Table_Suivi_Etat.Date_Debut_Etat as 'Date de Création'
     
    FROM ((((((((Table_Formulaire)
     
     
    INNER JOIN Table_Equipement
    ON (Table_Equipement.ID_Equipement = Table_Formulaire.ID_Equipement))
     
    INNER JOIN Table_Ligne 
    ON (Table_Equipement.ID_Ligne = Table_Ligne.ID_Ligne))
     
    INNER JOIN Table_VS
    ON (Table_VS.ID_VS = Table_Ligne.ID_VS))
     
    INNER JOIN Table_NatureDemande 
    ON (Table_Formulaire.ID_Nature = Table_NatureDemande.ID_NatureDemande))
     
    INNER JOIN Table_NivCompte
    ON (Table_NivCompte.ID_NivCompte = Table_Formulaire.ID_Compte_Actuel))
     
    INNER JOIN Table_NivCompte1
    ON ( Table_NivCompte1.ID_NivCompte = Table_Formulaire.ID_Compte_Demandé))
     
    INNER JOIN Table_Suivi_Etat
    ON ( Table_Suivi_Etat.ID_Formulaire = Table_Formulaire.ID_Formulaire))
    WHERE Table_Suivi_Etat.ID_Etat = 1
    Dois-je Insérer ma première requête avant le "FROM" de ma 2ème requête en enlevant le premier SELECT de ma première Requête?



    Je vous Remerci !!

    Gab

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 262
    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 262
    Points : 12 936
    Points
    12 936
    Par défaut
    Bonjour,
    Avec une jointure externe c'est faisable:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select t1.col1
    from LaTable t1
    left outer join LaTable t2 on t2.col2 = t1.col2 and t2.coldate > t1.coldate
    where t2.col1 is null
    Reste à voir la gestion des doublons...

    Tatayo.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 68
    Points : 33
    Points
    33
    Par défaut
    @tatayo

    J'ai du oublié de le préciser mais concernant la première requête , tout se trouve dans une seule et même base.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 262
    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 262
    Points : 12 936
    Points
    12 936
    Par défaut
    Oui, mais comme tu peux le voir je n'accède qu'à une seule table, donc je ne comprends pas bien la remarque...

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 68
    Points : 33
    Points
    33
    Par défaut
    oups désolé je n'ai pas du comprendre une partie du code alors ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT t1.col1
    FROM LaTable t1
    LEFT OUTER JOIN LaTable t2 ON t2.col2 = t1.col2 AND t2.coldate > t1.coldate
    WHERE t2.col1 IS NULL
    vous avez directement traiter la table dans le LEFT OUTER JOIN?

  6. #6
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonsoir,

    Pourriez vous préciser votre SGBD svp ?


  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 68
    Points : 33
    Points
    33
    Par défaut
    Je travail avec Access .. c'est une des contraintes du projet..

    [EDIT]

    Je suis navré mais je n'arrive pas utiliser votre requête...

    Quelqu'un aurait il une autre idée?

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 68
    Points : 33
    Points
    33
    Par défaut
    Bonjour a tous,
    Concernant ma requête j'ai un peu avancé,
    Pour ce que je veux faire, j'ai crée deux Requetes :

    La première renvoi 7 Colonnes + 1 (que l'on va appellé colonne 1)
    La deuxième renvoi les 7 mêmes colonnes + 1 (colonne 2)

    J'aimerai que ma requête finale revoie uniquement les 7 colonnes + colonne1 + colonne 2

    voici le code des 2 requêtes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT Table_Formulaire.ID_Formulaire, Table_Equipement.Nom_Equipement, Table_Ligne.Nom_Ligne, Table_VS.Nom_VS, Table_NatureDemande.Libellé_NatureDemande, Table_NivCompte.Nom_Compte AS [Compte Actuel], Table_NivCompte1.Nom_Compte AS [Compte Souhaité], Table_Suivi_Etat.Date_Debut_Etat AS [Date_Création]
    FROM Table_VS INNER JOIN (Table_Ligne INNER JOIN (Table_Equipement INNER JOIN ((((Table_Formulaire INNER JOIN Table_NatureDemande ON Table_Formulaire.ID_Nature = Table_NatureDemande.ID_NatureDemande) INNER JOIN Table_NivCompte ON Table_Formulaire.ID_Compte_Actuel = Table_NivCompte.ID_NivCompte) INNER JOIN Table_NivCompte1 ON Table_Formulaire.ID_Compte_Demandé = Table_NivCompte1.ID_NivCompte) INNER JOIN Table_Suivi_Etat ON Table_Formulaire.ID_Formulaire = Table_Suivi_Etat.ID_Formulaire) ON Table_Equipement.ID_Equipement = Table_Formulaire.ID_Equipement) ON Table_Ligne.ID_Ligne = Table_Equipement.ID_Ligne) ON Table_VS.ID_VS = Table_Ligne.ID_VS
    WHERE (((Table_Formulaire.Utilisateur)="unID")) AND Table_Suivi_Etat.ID_Etat = 1 
    ORDER BY Table_Formulaire.ID_Formulaire;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT Table_Formulaire.ID_Formulaire, Table_Equipement.Nom_Equipement, Table_Ligne.Nom_Ligne, Table_VS.Nom_VS, Table_NatureDemande.Libellé_NatureDemande, Table_NivCompte.Nom_Compte AS [Compte Actuel], Table_NivCompte1.Nom_Compte AS [Compte Souhaité], Table_Etat.Libelle_Etat
    FROM Table_Etat INNER JOIN (Table_VS INNER JOIN (Table_Ligne INNER JOIN (Table_Equipement INNER JOIN ((((Table_Formulaire INNER JOIN Table_NatureDemande ON Table_Formulaire.ID_Nature = Table_NatureDemande.ID_NatureDemande) INNER JOIN Table_NivCompte ON Table_Formulaire.ID_Compte_Actuel = Table_NivCompte.ID_NivCompte) INNER JOIN Table_NivCompte1 ON Table_Formulaire.ID_Compte_Demandé = Table_NivCompte1.ID_NivCompte) INNER JOIN Table_Suivi_Etat ON Table_Formulaire.ID_Formulaire = Table_Suivi_Etat.ID_Formulaire) ON Table_Equipement.ID_Equipement = Table_Formulaire.ID_Equipement) ON Table_Ligne.ID_Ligne = Table_Equipement.ID_Ligne) ON Table_VS.ID_VS = Table_Ligne.ID_VS) ON Table_Etat.ID_Etat = Table_Suivi_Etat.ID_Etat
    WHERE (((Table_Formulaire.Utilisateur)="unID") AND ((Table_Suivi_Etat.Date_Debut_Etat) In (SELECT Max(Table_suivi_Etat.Date_Debut_Etat) 
    FROM Table_suivi_Etat
    GROUP BY Table_suivi_Etat.ID_Formulaire)))
    ORDER BY Table_Formulaire.ID_Formulaire;
    Merci d'avance
    Bonne Fin de WE

  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 109
    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 109
    Points : 28 434
    Points
    28 434
    Par défaut
    Qu'est-ce qui t’empêche de faire une jointure entre les deux ?

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 68
    Points : 33
    Points
    33
    Par défaut
    Bonjour al1,

    je n'arrive pas a effectuer une jointure qui fonctionne :

    Pour Mieux expliquer je vais détailler ma table "Table_Suivi_Etat"

    ID_Table_Suivi_Etat (PK) | ID_Etat (FK) | ID_Formulaire (FK) | Date_Changement_Etat

    La différence entre les deux requêtes sont :

    1. La première affiche la Date_Changement_Etat ou ID_Etat = 1
    C'est la date de création du formulaire

    2. La deuxième affiche l'ID etat pour le Max(Date_Changement_Etat)
    C'est l'etat actuel du formulaire.

    J'ai essayé de faire ma jointure via plusieurs facon mais je n'y arrive pas.....
    comme je lui demande d'une part de prendre le Max de la Date_Debut_Etat puis de prendre la Date_Debut_Etat ou l'id est égal à 1 il filtre encore plus..

    rappel : j'aimerai obtenir deux colonnes distinctes (et indépendantes l'une de l'autre a part le fait que l'ID formulaire est identique) avec la Date_Debut_Etat ou ID_etat = 1 et pour l'autre colonnes : l'etat ou il y MAX(Date_Debut_Etat)


    Merci de votre aide.

    gab

  11. #11
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 109
    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 109
    Points : 28 434
    Points
    28 434
    Par défaut
    Serait-ce quelque chose comme ça que tu essayes de faire ?
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    SELECT  frm.ID_Formulaire
        ,   eqp.Nom_Equipement
        ,   lig.Nom_Ligne
        ,   tvs.Nom_VS
        ,   ndm.Libellé_NatureDemande
        ,   niv.Nom_Compte          AS [Compte Actuel]
        ,   ni1.Nom_Compte          AS [Compte Souhaité]
        ,   se1.Date_Debut_Etat     AS [Date_Création]
        ,   eta.Libelle_Etat
    FROM    Table_Formulaire    AS frm
        INNER JOIN
            Table_NatureDemande AS ndm
            ON  frm.ID_Nature = ndm.ID_NatureDemande
        INNER JOIN
            Table_NivCompte     AS niv
            ON  frm.ID_Compte_Actuel = niv.ID_NivCompte
        INNER JOIN
            Table_NivCompte1    AS ni1
            ON  frm.ID_Compte_Demandé = ni1.ID_NivCompte
        INNER JOIN
            Table_Suivi_Etat    AS eta
            ON  frm.ID_Formulaire = eta.ID_Formulaire
        INNER JOIN
            Table_Equipement    AS eqp
            ON  frm.ID_Equipement = eqp.ID_Equipement         
        INNER JOIN 
            Table_Ligne AS  lig 
            ON  eqp.ID_Ligne = lig.ID_Ligne
        INNER JOIN 
            Table_VS    AS  tvs
            ON  lig.ID_VS = tvs.ID_VS
        INNER JOIN
            Table_Suivi_Etat    AS se1
            ON  frm.ID_Formulaire = eta.ID_Formulaire
        INNER JOIN
            Table_Suivi_Etat    AS se2
            ON  frm.ID_Formulaire = eta.ID_Formulaire
        INNER JOIN 
            Table_Etat  AS eta
            ON  eta.ID_Etat = se2.ID_Etat
    WHERE   frm.Utilisateur = "unID" 
        AND se1.ID_Etat = 1 
        AND se2.Date_Debut_Etat
            =   (   SELECT  MAX(et0.Date_Debut_Etat) 
                    FROM    Table_suivi_Etat    et0
                    --  WHERE   et0.ID_Formulaire = frm.ID_Formulaire
                    GROUP BY et0.ID_Formulaire
                )
    ORDER BY frm.ID_Formulaire
    ;

Discussions similaires

  1. [MySQL] Select like et quotes
    Par Teppic dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 24/02/2009, 09h22

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