Disons que j'ai Table1 qui a des lignes en double (oubliez le fait qu'il n'a pas de clé primaire...) Est-il possible de réécrire ce qui suit sans utiliser de JOIN, de sous-requête ou de CTE et aussi sans avoir à épeler les colonnes dans quelque chose comme un PAR GROUPE?

SELECT COUNT(*)
FROM (
    SELECT DISTINCT * FROM Table1
) T1
14
squillman 19 févr. 2010 à 17:24
Pourquoi ne veux-tu pas de sous-requête ?
 – 
erikkallen
20 févr. 2010 à 03:54
@erikkallen : plus une pondération, vraiment. J'aime connaître mes options :)
 – 
squillman
10 mars 2010 à 04:43
SELECT COUNT(DISTINCT(col1)) FROM T1
 – 
Yevgen
6 oct. 2018 à 00:33

4 réponses

Meilleure réponse

Vous pouvez faire quelque chose comme ça.

SELECT Count(DISTINCT ProductName) FROM Products

Mais si vous voulez un nombre d'enregistrements complètement distincts, vous devrez utiliser l'une des autres options que vous avez mentionnées.

Si vous vouliez faire quelque chose comme vous l'avez suggéré dans la question, cela impliquerait que vous avez des enregistrements en double dans votre table.

Si vous n'aviez pas d'enregistrements en double, SELECT DISTINCT * from table serait le même sans le distinct.

13
awright18 20 févr. 2010 à 03:50
Merci pour cet exemple - c'était exactement mon problème lorsque je suis venu chercher.
 – 
Ubiquitous Che
19 déc. 2010 à 23:38

Non, ce n'est pas possible.

Si vous êtes limité par votre framework/outil de requête/quel que soit, que vous ne pouvez pas utiliser de sous-requête et que vous ne pouvez pas épeler chaque nom de colonne dans le GROUP BY, vous êtes SOL.

Si vous n'êtes pas limité par votre framework/outil de requête/quoi que ce soit, il n'y a aucune raison de ne pas utiliser une sous-requête.

9
Peter Radocchia 20 févr. 2010 à 10:15

Si vous voulez vraiment vraiment faire cela, vous pouvez simplement "SELECT COUNT (*) FROM table1 GROUP BY all,columns, here" et prendre la taille de l'ensemble de résultats comme compte.

Mais ce serait un code digne de dailywtf ;)

3
douwe 19 févr. 2010 à 17:35
Ouais, donc la déclaration "Je ne veux pas utiliser un GROUP BY" dans ma question ;)
 – 
squillman
19 févr. 2010 à 17:37

Je voulais juste affiner la réponse en disant que vous devez vérifier que le type de données des colonnes est comparable - sinon vous obtiendrez une erreur en essayant de les rendre DISTINCT :

Par exemple. com.microsoft.sqlserver.jdbc.SQLServerException : le type de données ntext ne peut pas être sélectionné comme DISTINCT car il n'est pas comparable.

Cela est vrai pour les grandes colonnes binaires, xml et autres en fonction de votre SGBDR - rtm. La solution pour SQLServer, par exemple, consiste à le convertir d'un ntext en nvarchar(MAX) à partir de SQLServer 2005.

Si vous vous en tenez aux colonnes PK, tout devrait bien se passer (je ne l'ai pas vérifié moi-même mais j'aurais logiquement pensé que les colonnes PK devraient être comparables)

1
Jim Hobday 25 mars 2013 à 14:18