Bedste svar
i SQL kan DISTINCT-klausulen bruges *** før *** på listen, for at undgå duplikerede rækker i output eller *** inde i *** en aggregeringsfunktion, såsom COUNT. I det andet tilfælde, især for COUNT, er effekten kun at overveje at gentage værdier en gang. En løsning er, at med sammenkædningen foreslået af Greg Kemnitz bortset fra en lille fejl og tilpasninger afhængigt af kolonnetyper og strengfunktioner i de forskellige sql-motorer
VÆLG TÆLL (DISTINCT CONCAT (col1, …. , col3)) FROM-tabel;
Den nemme løsning
VÆLG TÆLL (DISTINCT col1, col2, col3) FRA-tabel;
fungerer med MySQL, fungerer ikke arbejde i DB2, og jeg kender ikke til andre motorer, men det er ikke standard SQL.
En anden, mere kompliceret løsning, som kan være mere effektiv, hvis operationen er hyppig og tilstrækkelig optimeret, kræver oprettelse af en visning
CREATE VIEW vw AS SELECT DISTINCT col1, col2, col3 GROUP BY col1, col2, col3; VÆLG TÆLL (*) FRA vw;
Svar
mysql> Opret tabel falsk (foo tinyint (3) ikke null standard 0, bar varchar (64) ikke null standard “”) ; Forespørgsel OK, 0 rækker berørt (0,07 sek)
mysql> indsæt i falske værdier (1, “foo”), (1, “bar”), (2, “foo”), (2, “bar”), (3, “baz”), (3, “for”); Forespørgsel OK, 6 rækker berørt (0,00 sek) Records: 6 duplikater: 0 Advarsler: 0
mysql> vælg foo, bar, count (*) fra falsk gruppe efter foo, bar; + —– + —– + ———- + | foo | bar | tælle (*) | + —– + —– + ———- + | 1 | bar | 1 | | 1 | foo | 1 | | 2 | bar | 1 | | 2 | foo | 1 | | 3 | baz | 1 | | 3 | til | 1 | + —– + —– + ———- + 6 rækker i sæt (0,00 sek)
mysql> indsæt i falske værdier (1, “foo “), (1,” bar “), (2,” foo “), (2,” bar “), (3,” baz “), (3,” for “); Forespørgsel OK, 6 rækker berørt (0,00 sek) Records: 6 duplikater: 0 Advarsler: 0
mysql> vælg foo, bar, count (*) fra falsk gruppe efter foo, bar; + —– + —– + ———- + | foo | bar | tælle (*) | + —– + —– + ———- + | 1 | bar | 2 | | 1 | foo | 2 | | 2 | bar | 2 | | 2 | foo | 2 | | 3 | baz | 2 | | 3 | til | 2 | + —– + —– + ———- + 6 rækker i sæt (0,00 sek)
mysql>