Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/07/2011, 14h42   #1
Membre à l'essai
 
Inscription : septembre 2005
Messages : 110
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 110
Points : 22
Points : 22
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 :
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.
Stephane_br est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 15h01   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

Vous pouvez faire comme ceci :
Code SQL :
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 :
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
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 15h28   #3
Membre à l'essai
 
Inscription : septembre 2005
Messages : 110
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 110
Points : 22
Points : 22
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 :
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
Stephane_br est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 15h35   #4
Membre à l'essai
 
Inscription : septembre 2005
Messages : 110
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 110
Points : 22
Points : 22
Désolé, c'est bon, j'ai trouvé. Désolé.
Merci beaucoup pour votre réponse.

Code :
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
Stephane_br est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h10.


 
 
 
 
Partenaires

Hébergement Web