2017-03-27 4 views
0

Je voudrais ajouter le résultat du comptage d'une 2ème requête à l'ensemble de résultats qui interroge la 1ère table et connectez-vous cette sous-requête avec l'ID du 1er résultat de tableau. Ce code simplifié l'explique:sous-requête SQL Server pour le comptage en 2e tableau

Select 
    ID_Field_Table1, 
    (Select Count(x) 
    From Table2 
    Where ID_Field_Table2 = ID_Field_Table1) As mycount 
From Table1 

Quelle est la bonne syntaxe? Merci

Ce code est simplifié mais la construction est la même. Dans ma base de données, ID_Field_Table2 et ID_Field_Table1 ont le même nom (disons ID_Field). Si j'utilise ce même nom, le SubQuery va comme "... où ID_Field = ID_Field .." et cela renvoie toujours un Reslut, car il ne connecte pas les requêtes ("Select a Où x = x" retourne tout enregistrement dans le Tableau 2).

Select 
    ID_Field AS ID1, 
    (Select Count(x) 
    From Table2 
    Where ID_Field = ID1) As mycount 
From Table1 

Il retourne juste une erreur, disant que ID1 n'existe pas.

  1. Lorsque j'utilise le nom original des colonnes (qui sont les mêmes), le résultat est faux

  2. Quand je nous un alias, une erreur se produit

Je pense que la requête est fausse du tout.

+1

Votre requête me semble correcte. Que voulez-vous dire par "ne fonctionne pas"? –

+1

Il est difficile d'offrir des solutions lorsque l'énoncé du problème est simplement «ça ne marche pas». S'il vous plaît [modifier] votre question pour donner une description plus complète de ce que vous attendiez et comment cela diffère des résultats réels. Voir [demander] pour des conseils sur ce qui fait une bonne explication. –

Répondre

1

Eh bien, vous ne pouvez pas utiliser un alias défini dans la clause select, mais vous pouvez utiliser les alias définis dans la clause:

Select 
    ID_Field AS ID1, 
    (Select Count(x) 
    From Table2 
    Where ID_Field = t1.ID_Field) As mycount 
From Table1 t1 

Vous pouvez aussi le faire sans un alias, puisque la sous requête est pour une autre table:

Select 
    ID_Field AS ID1, 
    (Select Count(x) 
    From Table2 
    Where ID_Field = Table1.ID_Field) As mycount 
From Table1 

Cependant, je soupçonne une requête en utilisant jointure gauche à une table dérivée comme suggéré dans la réponse de esta aurait de meilleures performances.

+0

Cela fonctionne. Je vous remercie. Maintenant que je le vois, je me demande pourquoi je n'ai pas essayé ça avant;) – Jan

0

Quelque chose comme ça?

Select 
    Table1.ID_Field_Table1, 
    T2.MYCOUNT  
From Table1 
LEFT JOIN (SELECT ID_Field_Table2, COUNT(x) AS MYCOUNT FROM TABLE2 GROUP BY ID_FIELD_TABLE2) T2 ON T2.ID_Field_Table2=Table1.ID_Field_Table1 
0

Essayez cette requête une fois qu'elle peut vous être utile.

Select ID_Field_Table1,COUNT_NBR 
cross apply 
(
Select Count(x) as COUNT_NBR 
    From Table2 
    Where ID_Field_Table2 = ID_Field_Table1 
    group by ID_Field_Table1 
) As mycount 
From Table1