2008-12-20 7 views
2

Je regardais les requêtes internes sql (un peu comme l'équivalent sql d'une méthode C# anon), et je me demandais, puis-je retourner plus d'une valeur à partir d'une requête? Par exemple, renvoyer le nombre de lignes d'une table comme une valeur de sortie et, en tant qu'autre valeur de sortie, renvoyer le nombre distinct de lignes?Renvoyer plus d'une valeur à partir d'une instruction SQL

En outre, comment fonctionne distinct? Est-ce basé sur si un champ peut être le même qu'un autre (donc classé comme «distinct»)? J'utilise Sql Server 2005. Y aurait-il une pénalité de performance si je renvoyais une valeur d'une requête, plutôt que deux d'une requête?

Merci

Répondre

2

Vous pouvez faire votre première question en faisant ceci:

SELECT 
    COUNT(field1), 
    COUNT(DISTINCT field2) 
FROM table 

(. Pour le premier champ que vous pourriez faire * si nécessaire pour compter les valeurs nulles)

Distinct signifie la définition du mot. Il élimine les lignes retournées en double.

Renvoyer 2 valeurs au lieu de 1 dépend de ce que les valeurs étaient, si elles ont été indexées ou non et d'autres variables possibles indéterminées.

Si vous voulez dire sous-requêtes dans l'instruction select, non, vous ne pouvez renvoyer qu'une seule valeur. Si vous voulez plus de 1 valeur, vous devrez utiliser la sous-requête comme une jointure.

0

Si la requête interne est en ligne dans SELECT, vous pouvez avoir du mal à sélectionner plusieurs valeurs. Cependant, il est souvent possible de JOIN à une sous-requête à la place; de cette façon, la sous-requête peut être nommée et vous pouvez obtenir plusieurs résultats

SELECT a.Foo, a.Bar, x.[Count], x.[Avg] 
FROM a 
INNER JOIN (SELECT COUNT(1) AS [Count], AVG(something) AS [Avg]) x 
    ON x.Something = a.Something 

Ce qui pourrait aider.

DISTINCT fait ce qu'il dit. IIRC, vous pouvez SELECT COUNT(DISTINCT Foo) etc pour interroger des données distinctes.

0

requêtes internes sous la forme:

SELECT * FROM tbl WHERE fld in (SELECT fld2 FROM tbl2 WHERE tbl.fld = tbl2.fld2) 

ne peut pas renvoyer plusieurs lignes. Lorsque vous avez besoin de plusieurs lignes à partir d'une requête secondaire, vous devez généralement effectuer une jointure interne sur l'autre requête.

lignes:

SELECT count(*), count(distinct *) from table 

renvoie un jeu de données avec une ligne contenant deux colonnes. La colonne 1 représente le nombre total de lignes dans la table. La colonne 2 ne compte que des lignes distinctes. Distinct signifie que l'ensemble de données renvoyé n'aura pas de doublon lignes. Distinct ne peut apparaître qu'une seule fois directement après la sélection.Ainsi, une requête telle que:

SELECT distinct a, b, c FROM table 

pourrait avoir ce résultat:

a1 b1 c1 
a1 b1 c2 
a1 b2 c2 
a1 b3 c2 

Notez que les valeurs sont dupliquées sur le résultat ensemble, mais chaque ligne est unique.

Je ne suis pas sûr de savoir ce que signifie votre dernière question. Vous devriez retourner à partir d'une requête toutes les données pertinentes à la requête. En ce qui concerne la rapidité, seule l'analyse comparative peut vous dire quelle approche est la plus rapide.

0

vous pouvez retourner plusieurs résultats de 3 manières différentes (du haut de ma tête)

  1. En ayant une sélection avec plusieurs valeurs par exemple: sélectionnez col1, col2, col3
  2. Avec plusieurs requêtes, par exemple: sélectionnez 1 ; sélectionnez "2"; sélectionnez colA. vous obtiendrez à eux dans un lecteur de données en appelant .NextRecord()
  3. En utilisant les paramètres de sortie, déclarez les paramètres avant l'exécution de la requête puis récupérez la valeur par la suite. Par exemple: set @ param1 = "2". string myparam2 = sqlcommand.parameters ["param1"]. tostring()

Distincts, les filtres résultants sont uniques.

Questions connexes