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
4 réponses
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.
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.
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 ;)
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)
Questions connexes
De nouvelles questions
sql-server
Microsoft SQL Server est un système de gestion de base de données relationnelle (SGBDR). Utilisez cette balise pour toutes les éditions de SQL Server, y compris Compact, Express, Azure, Fast-track, APS (anciennement PDW) et Azure SQL DW. N'utilisez pas cette balise pour d'autres types de SGBD (MySQL, PostgreSQL, Oracle, etc.). N'utilisez pas cette balise pour des problèmes de développement logiciel et mobile, sauf si elle est directement liée à la base de données.
SELECT COUNT(DISTINCT(col1)) FROM T1