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

Développement SQL Server Discussion :

Deux requêtes dans une seule requête, est-ce possible ?


Sujet :

Développement SQL Server

  1. #1
    Membre régulier Avatar de Stephane_br
    Inscrit en
    Septembre 2005
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 222
    Points : 83
    Points
    83
    Par défaut Deux requêtes dans une seule requête, est-ce possible ?
    Bonjour,

    Voilà, j'ai une base FAMILLES avec pour chaque ligne, un ID unique et un nom de famille.
    J'ai également une base produits avec pour chaque ligne un iD unique, un nom, etc ... et l'Id de la famille à laquelle il appartient.


    Je voudrais faire une opération en une seule requête mais je ne sais pas si cela est possible et si oui, comment faire ??...

    Voilà : mon but serait de faire remonter en une seule requête, toutes les familles, c'est à dire, un SELECT * FROM FAMILLE tout à fait classique. Bon, jusque-là pas de soucis.

    Mais maintenant, je souhaiterais ajouter dans cette requête, une info qui indiquerait pour chaque famille, si des produits associés existent (c'est à dire, contenant l'Id de cette famille).
    J'aimerais avoir dans le résultat de ma seule requête, un champs qui contiendrait True ou False (ou autre, peut importe) pour indiquer cela.

    Ceci dans le but d'utiliser une seule requête et accèder une seule fois à ma base SQL et ainsi éviter d'avoir à faire 15000 requêtes pour savoir ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT * FROM FAMILLE 
    TANT QUE il y a des familles FAIRE
       SELECT * FROM PRODUCTS WHERE PRodIdFamille=i
       Si il y a des produits, alors //voir si cela retourne des lignes ou pas
         produitsExistent = True
       sinon
         produitsExistent = False
       Fin si
    SUIVANT


    Je ne sais si je suis clair ou confus dans mes propos, veuillez m'en excuser par avance ....

    Pensez-vous que cela soit faisable en une seule requête SQL ou pas ?

    Merci par avance.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Vous pouvez faire comme ceci :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT
        F.id,
        F.Nom,
        CASE
            WHEN P.id IS NULL THEN 'absent' 
            ELSE 'Present'
        END AS Presence
    FROM Famille F
    LEFT OUTER JOIN Produit P
        ON F.id = P.IdFamille
    GROUP BY F.ID; F.Nom, P.id

    ou bien comme ceci :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT 
        F.id,
        F.Nom,
        COALESCE(R.Presence, 'absent')
    FROM Famille F
    OUTER APPLY (
        SELECT TOP(1) 'Present' AS Presence
        FROM Produit P
        WHERE P.idFamille = F.id
    ) R

  3. #3
    Membre régulier Avatar de Stephane_br
    Inscrit en
    Septembre 2005
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 222
    Points : 83
    Points
    83
    Par défaut
    Alors là, c'est super !!! Merci beaucoup pour cette réponse.
    j'ai adapté mon code comme ci-dessous; ça fonctionne, par contre, le nom de la colonne contenant 'absent' ou 'présent' est vide. Comment faire pour lui donner un nom afin de pouvoir l'appeler derrière ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT 
        F.SousFamilleId,
        F.SousFamilleNom,
        F.SousFamilleParentId,
        COALESCE(R.Presence, 'absent')
    FROM FAMILLE2 F 
    OUTER APPLY (
        SELECT TOP(1) 'Present' AS Presence
        FROM PX P
        WHERE CONVERT(int, P.PX_SSFAMILLE) = F.SousFamilleId
    ) R
    WHERE F.SousFamilleParentId=61

  4. #4
    Membre régulier Avatar de Stephane_br
    Inscrit en
    Septembre 2005
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 222
    Points : 83
    Points
    83
    Par défaut
    Désolé, c'est bon, j'ai trouvé. Désolé.
    Merci beaucoup pour votre réponse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT 
        F.SousFamilleId,
        F.SousFamilleNom,
        F.SousFamilleParentId,
        COALESCE(R.Presence, 'absent') As ColIsEmptyOrNot
    FROM FAMILLE2 F 
    OUTER APPLY (
        SELECT TOP(1) 'Present' AS Presence
        FROM PX P
        WHERE CONVERT(int, P.PX_SSFAMILLE) = F.SousFamilleId
    ) R
    WHERE F.SousFamilleParentId=61

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/10/2011, 11h07
  2. requête sql qui joint deux champs dans une seule chaine
    Par marwacht dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/05/2011, 10h29
  3. Deux COUNT dans une seule requête
    Par aya02 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/07/2010, 10h17
  4. Réponses: 4
    Dernier message: 20/05/2010, 12h28
  5. [Oracle] Deux COUNT dans une seule requête
    Par EvilJajuka dans le forum Débuter
    Réponses: 5
    Dernier message: 30/09/2009, 11h00

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