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

MS SQL Server Discussion :

sous-requetes ou jointure ?


Sujet :

MS SQL Server

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Février 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut sous-requetes ou jointure ?
    bonjour,
    j'ai un probleme avec un requete SQL car je n'arrive pas a faire simplement ce que je veux faire.
    J'ai 3 tables : Vacancies, VacancyStatus et State.
    Une vacancies peut avoir un certain nombre de VacancyStatus.
    Les vacancystatus sont des historiques de State.

    J'aimerais pouvoir récupérer l'ensemble des vacancies avec le nom et la date de leur dernier en date VacancyStatus (et seulement le dernier en date) dans une seule ligne.
    Je n'y arrive malheureusement qu'en utilisant 2 fois la meme sous-requete.
    Y a t il un moyen de faire la meme chose avec une jointure?
    Ou bien y a t il moyen de stocker le resultat d'une sous-requete pour ne pas l'executer 2 fois ?

    voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT     Vacancy.VID, Vacancy.PostNumber, Vacancy.PostTitle, Vacancy.PostLevel, Vacancy.PostGrade, vwUnitA.OFFNAMES AS UnitName,
                              (SELECT     TOP 1 State.Name
    FROM         VacancyStatus INNER JOIN
                          State ON VacancyStatus.StateID = State.StateID
    WHERE     (VacancyStatus.VID = Vacancy.VID) ORDER BY VacancyStatus.StateCreationDate DESC) AS StateName
    ,
    (SELECT     TOP 1 VacancyStatus.StateCreationDate
    FROM         VacancyStatus 
    WHERE     (VacancyStatus.VID = Vacancy.VID)
    ORDER BY VacancyStatus.StateCreationDate DESC) AS StateCreationDate
     
    FROM         Vacancy LEFT OUTER JOIN
     vwUnitA ON Vacancy.Unit = vwUnitA.UNIT_CODE
    un grand merci pour votre aide par avance
    kumkum

  2. #2
    Membre régulier Avatar de DonkeyMaster
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 95
    Points : 110
    Points
    110
    Par défaut
    Tu pourrais mettre une condition where qui filtre juste la dernière ligne. Pour cela, tu peux t'en sortir avec requête imbriquée et un MAX

    Quelque chose du genre :

    Code SQL : 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
     SELECT     
        Vacancy.VID, 
        Vacancy.PostNumber, 
        Vacancy.PostTitle, 
        Vacancy.PostLevel, 
        Vacancy.PostGrade, 
        vwUnitA.OFFNAMES AS UnitName, 
        State.Name,
        VacancyStatus.StateCreationDate,
        FROM         Vacancy 
        LEFT OUTER JOIN vwUnitA ON Vacancy.Unit = vwUnitA.UNIT_CODE
        INNER JOIN    State ON VacancyStatus.StateID = State.StateID
        WHERE VacancyStatus.StateCreationDate = 
            (SELECT max(VacancyStatus.StateCreationDate) 
            FROM VacancyStatus     
            WHERE     VacancyStatus.VID = Vacancy.VID)



    (vérifie cette la syntaxe de cette requête, bien sûr, je n'ai pas pu tester)

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Février 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    merci

    je crois que j'étais déjà passé par une syntaxe de ce genre mais le probleme , alors, était que s'il y avait pas de lignes dans vacancystatus, la requete ne renvoyait rien, or je veux une ligne quand meme pour toutes celle de vacancy, avec dans ce cas des champs à NULL dans les colonnes StateName et StateCreationDate.

  4. #4
    Membre régulier Avatar de DonkeyMaster
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 95
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par kumkum74 Voir le message
    merci

    je crois que j'étais déjà passé par une syntaxe de ce genre mais le probleme , alors, était que s'il y avait pas de lignes dans vacancystatus, la requete ne renvoyait rien, or je veux une ligne quand meme pour toutes celle de vacancy, avec dans ce cas des champs à NULL dans les colonnes StateName et StateCreationDate.
    Si tu veux tes colonnes à null, essaie avec left outer join. Si je me souviens bien, cela permet de garder tes lignes s'il n'y a pas de correspondance derrière.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    LEFT OUTER JOIN VacancyStatus ON VacancyStatus.StateCreationDate =          (SELECT max(VacancyStatus.StateCreationDate) 
            FROM VacancyStatus     
            WHERE     VacancyStatus.VID = Vacancy.VID)

    UNION, ça marcherait aussi, mais je crois que niveau syntaxe ce serait encore plus long à écrire (mais plus facile à lire).

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Février 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    est tu sure que cette syntaxe est correcte ?
    de mettre un select directement dans le join ?

    je n'arrive pas à écrire corectement cette fin de syntaxe

    voici ce à quoi j'étais arrivé, mais qui ne retourne pas de ligne quand il n'y a rien dans vacancystatus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT     Vacancy.VID, Vacancy.PostNumber, Vacancy.PostTitle, Vacancy.PostLevel, Vacancy.PostGrade, vwUnitA.OFFNAMES AS UnitName, 
                          VacancyStatus.StateCreationDate, State.Name
    FROM         State INNER JOIN
                          VacancyStatus ON State.StateID = VacancyStatus.StateID RIGHT OUTER JOIN
                          Vacancy ON VacancyStatus.VID = Vacancy.VID LEFT OUTER JOIN
                          vwUnitA ON Vacancy.Unit = vwUnitA.UNIT_CODE
    WHERE     (VacancyStatus.StateCreationDate =
                              (SELECT     MAX(VacancyStatus.StateCreationDate)
                                FROM          VacancyStatus
                                WHERE      VacancyStatus.VID = Vacancy.VID))

Discussions similaires

  1. Requete Update avec sous requete et jointure
    Par javaboy dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/05/2007, 11h03
  2. [Oracle] jointure et sous requete
    Par K_!!! dans le forum Langage SQL
    Réponses: 7
    Dernier message: 07/06/2006, 09h24
  3. Réponses: 15
    Dernier message: 14/04/2006, 15h34
  4. requete et jointure sous access
    Par sapic dans le forum Access
    Réponses: 4
    Dernier message: 03/04/2006, 12h21
  5. requete de jointure sous delphi
    Par kaouther dans le forum Bases de données
    Réponses: 1
    Dernier message: 29/12/2005, 11h22

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