Beste svaret
i SQL kan DISTINCT-leddet brukes *** før *** listen er valgt, for å unngå dupliserte rader i utdata eller *** inne i *** en aggregeringsfunksjon, for eksempel COUNT. I det andre tilfellet, spesielt for COUNT, er effekten å vurdere å gjenta verdier bare en gang. En løsning er at med sammenkoblingen foreslått av Greg Kemnitz, bortsett fra en liten feil og tilpasninger avhengig av kolonnetyper og strengfunksjoner i de forskjellige SQL-motorene
VELG TELL (DISTINCT CONCAT (col1, …. , col3)) FRA tabell;
Den enkle løsningen
VELG TELL (DISTINCT col1, col2, col3) FRA tabell;
fungerer med MySQL, gjør ikke fungerer i DB2, og jeg vet ikke om andre motorer, men det er ikke standard SQL.
En annen, mer komplisert løsning, som kan være mer effektiv hvis operasjonen er hyppig og tilstrekkelig optimalisert, krever oppretting av en visning
OPPRETT VISNING vw SELECT DISTINCT col1, col2, col3 GROUP BY col1, col2, col3; VELG TELL (*) FRA vw;
Svar
mysql> lag tabell falske (foo tinyint (3) ikke null standard 0, bar varchar (64) ikke null standard «») ; Spørsmål OK, 0 rader påvirket (0,07 sek)
mysql> sett inn falske verdier (1, «foo»), (1, «bar»), (2, «foo»), (2, «bar»), (3, «baz»), (3, «for»); Spørring OK, 6 rader påvirket (0,00 sek) Records: 6 duplikater: 0 Advarsler: 0
mysql> velg foo, bar, count (*) fra falsk gruppe for foo, bar; + —– + —– + ———- + | foo | bar | telle (*) | + —– + —– + ———- + | 1 | bar | 1 | | 1 | foo | 1 | | 2 | bar | 1 | | 2 | foo | 1 | | 3 | baz | 1 | | 3 | for | 1 | + —– + —– + ———- + 6 rader i sett (0,00 sek)
mysql> sett inn falske verdier (1, «foo «), (1,» bar «), (2,» foo «), (2,» bar «), (3,» baz «), (3,» for «); Spørring OK, 6 rader påvirket (0,00 sek) Records: 6 duplikater: 0 Advarsler: 0
mysql> velg foo, bar, count (*) fra falsk gruppe for foo, bar; + —– + —– + ———- + | foo | bar | telle (*) | + —– + —– + ———- + | 1 | bar | 2 | | 1 | foo | 2 | | 2 | bar | 2 | | 2 | foo | 2 | | 3 | baz | 2 | | 3 | for | 2 | + —– + —– + ———- + 6 rader i sett (0,00 sek)
mysql>