Bästa svaret
i SQL kan DISTINCT-satsen användas *** innan *** valt listan, för att undvika dubbla rader i utdata eller *** inuti *** en aggregeringsfunktion, till exempel COUNT. I det andra fallet, särskilt för COUNT, är effekten att man bara överväger att upprepa värden en gång. En lösning är att med den sammanfogning som föreslagits av Greg Kemnitz, förutom ett litet misstag och anpassningar beroende på kolumntyper och strängfunktioner i de olika SQL-motorerna
VÄLJ RÄKNING (DISTINCT CONCAT (col1, …. , col3)) FROM-tabell;
Den enkla lösningen
VÄLJ RÄKNING (DISTINCT col1, col2, col3) FROM-tabell;
fungerar med MySQL, fungerar inte fungerar i DB2 och jag vet inte om andra motorer, men det är inte standard SQL.
En annan, mer komplicerad lösning, som kan vara effektivare om operationen är frekvent och adekvat optimerad, kräver att man skapar en vy
CREATE VIEW vW AS SELECT DISTINCT col1, col2, col3 GROUP BY col1, col2, col3; VÄLJ RÄKN (*) FRÅN vw;
Svar
mysql> skapa tabell falsk (foo tinyint (3) inte null standard 0, bar varchar (64) inte null standard ””) ; Fråga OK, 0 rader påverkade (0,07 sek)
mysql> infoga i falska värden (1, ”foo”), (1, ”bar”), (2, ”foo”), (2, ”bar”), (3, ”baz”), (3, ”for”); Fråga OK, 6 rader påverkade (0,00 sek) Records: 6 duplikat: 0 Varningar: 0
mysql> välj foo, bar, count (*) från falsk grupp för foo, bar; + —– + —– + ———- + | foo | bar | räkna (*) | + —– + —– + ———- + | 1 | bar | 1 | | 1 | foo | 1 | | 2 | bar | 1 | | 2 | foo | 1 | | 3 | baz | 1 | | 3 | för | 1 | + —– + —– + ———- + 6 rader i uppsättning (0,00 sek)
mysql> infoga i falska värden (1, ”foo ”), (1,” bar ”), (2,” foo ”), (2,” bar ”), (3,” baz ”), (3,” for ”); Fråga OK, 6 rader påverkade (0,00 sek) Records: 6 duplikat: 0 Varningar: 0
mysql> välj foo, bar, count (*) från falsk grupp för foo, bar; + —– + —– + ———- + | foo | bar | räkna (*) | + —– + —– + ———- + | 1 | bar | 2 | | 1 | foo | 2 | | 2 | bar | 2 | | 2 | foo | 2 | | 3 | baz | 2 | | 3 | för | 2 | + —– + —– + ———- + 6 rader i uppsättning (0,00 sek)
mysql>