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 17/05/2011, 13h59   #1
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 746
Points : 746
Par défaut [2005] MIN + COUNT & JOIN

Bonjour.

J'aimerais en joignant deux tables, obtenir le nombre de lignes uniques que j'ai dans ma première table et la valeur minimale d'un champ dans la seconde table.
Je pense que ce n'est pas faisable sans sous query mais j'ai un léger doute que vous pouvez peut-être dissiper.

Disons :
Table1 : a INT, b INT, c BIT (PK : a, b)
Table2 : i INT, a INT, b INT, d DATETIME (PK : i FK : a, b).

J'aimerais obtenir :

Code :
1
2
3
4
5
6
7
8
9
10
 
SELECT
COUNT(DISTINCT T1.a, T2.b) AS CntT1 -- non supporté
, MIN(T2.d) AS MinD
FROM Table1 AS T1
INNER JOIN Table2 AS T2 ON (
T2.a = T1.a
AND
T2.b = T1.b
)
Est-ce possible sans sous-query ? Comment feriez-vous ?
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 14h29   #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

En fait je ne vois pas l’intérêt d'une jointure ici puisque vous n'avez ps besoin de mettre en relation les données des deux tables.
Vous voulez le nombre de ligne dans une table d'une part,
Le min d'une colonne d'une autre table d'autre part

Je ferai quelque chose comme ceci :

Code SQL :
1
2
3
4
 
SELECT 
    (SELECT COUNT(*) FROM Table1) AS CntT1,
    (SELECT MIN(d) FROM Table2) AS MinD
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 16h03   #3
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 746
Points : 746
Citation:
Envoyé par aieeeuuuuu Voir le message
Bonjour

En fait je ne vois pas l’intérêt d'une jointure ici puisque vous n'avez ps besoin de mettre en relation les données des deux tables.
C'est juste un exemple.
Je le modifie d'un poil pour clarifier que je ne suis pas passer à côté de l'évident

Code :
1
2
3
4
5
6
7
8
9
10
11
 
SELECT
COUNT(DISTINCT T1.a, T2.b) AS CntT1 -- non supporté
, MIN(T2.d) AS MinD
FROM Table1 AS T1
INNER JOIN Table2 AS T2 ON (
T2.a = T1.a
AND
T2.b = T1.b
)
WHERE T1.c = 1
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 17h35   #4
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
ok, je me disais aussi que j'avais du passer a coté de quelque chose

reprenons :

Je vois bien une solution bidouille à partir de votre requête initiale :
Code SQL :
1
2
3
4
5
6
7
8
9
10
11
 
SELECT
COUNT(DISTINCT STR(T1.a) + '|' +  STR(T2.b)) AS CntT1 
, MIN(T2.d) AS MinD
FROM Table1 AS T1
INNER JOIN Table2 AS T2 ON (
T2.a = T1.a
AND
T2.b = T1.b
)
WHERE T1.c = 1

Mais personnellement je ne suis pas un grand adepte de ce genre de bricolage...

Sinon il reste possible de modifier la requête que je vous ai donnée pour y ajouter le filtre (sur chacune des deux sous requêtes, avec une jointure ou un EXISTS sur la deuxième...)


Pour ma part, je testerais les performances d'une requête de ce type :
Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
 
SELECT
    COUNT(*) AS CntT1
    , MIN(T.mini) AS MinD
FROM Table1 AS T1
CROSS APPLY (
    SELECT MIN(d) AS mini
    FROM Table2 T2
    WHERE T2.a = T1.a
        AND T2.b = T1.b
)T
WHERE T1.c = 1

Qui, selon vos données/index/sélectivité du filtre/... , pourra vous donner de bons résultats. Il faudra surtout un index sur Table2(a,b,d)
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 11h30   #5
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 746
Points : 746
J'étais arrivé à cette solution (d'ailleurs, j'avais aussi songé puis écarté l'idée d'une concaténation) mais puisque de toute évidence avec une simple jointure toutes les données nécessaires à l'opération que je souhaite faire sont déjà là, je me disais qu'il y avait peut-être une écriture pour le faire.

Surtout qu'il existe des éléments de language (ou en tout cas des procédures) non documentés, on ne sait jamais.
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h43.


 
 
 
 
Partenaires

Hébergement Web