Paras vastaus
SQL: ssä DISTINCT-lauseketta voidaan käyttää *** ennen *** -luetteloa, jotta vältetään päällekkäiset rivit lähdössä tai *** *** -funktiossa, kuten COUNT. Toisessa tapauksessa, erityisesti COUNT: n kohdalla, vaikutus on harkita arvojen toistamista vain kerran. Yksi ratkaisu on, että Greg Kemnitzin ehdottamalla ketjutuksella lukuun ottamatta pientä virhettä ja mukautuksia saraketyypeistä ja merkkijonofunktioista riippuen eri sql-moottoreissa.
SELECT COUNT (DISTINCT CONCAT (col1, …. , col3)) FROM-taulukko;
Helppo ratkaisu
SELECT COUNT (DISTINCT col1, col2, col3) FROM-taulukko;
toimii MySQL: n kanssa, ei toimii DB2: ssa, enkä tiedä muista moottoreista, mutta se ei ole vakio SQL.
Toinen monimutkaisempi ratkaisu, joka voi olla tehokkaampi, jos toiminta on usein ja riittävän optimoitu, vaatii näkymä
Luo NÄKYMÄ vw ASETTUNA VALITSE EROTTAVA col1, col2, col3 RYHMÄ JAKA col1, col2, col3; SELECT COUNT (*) FW: stä;
vastaus
mysql> luo taulukon väärennös (foo tinyint (3) ei nolla oletusarvo 0, palkin varchar (64) ei nolla oletus ””) ; Kysely OK, 0 riviä vaikuttaa (0,07 sekuntia)
mysql> lisää väärennettyihin arvoihin (1, ”foo”), (1, ”bar”), (2, ”foo”), (2, ”bar”), (3, ”baz”), (3, ”for”); Kysely OK, 6 riviä vaikuttaa (0,00 s) Tietueet: 6 kaksoiskappaleet: 0 Varoitukset: 0
mysql> valitse foo, bar, count (*) väärennetystä ryhmästä foo, bar; + —– + —– + ———- + | foo | baari | määrä (*) | + —– + —– + ———- + | 1 | baari | 1 | | 1 | foo | 1 | | 2 | baari | 1 | | 2 | foo | 1 | | 3 | baz | 1 | | 3 | varten | 1 | + —– + —– + ———- + 6 riviä sarjassa (0,00 s)
mysql> lisää väärennettyihin arvoihin (1, ”foo ”), (1,” bar ”), (2,” foo ”), (2,” bar ”), (3,” baz ”), (3,” for ”); Kysely OK, 6 riviä vaikuttaa (0,00 s) Tietueet: 6 kaksoiskappaleet: 0 Varoitukset: 0
mysql> valitse foo, bar, count (*) väärennetystä ryhmästä foo, bar; + —– + —– + ———- + | foo | baari | määrä (*) | + —– + —– + ———- + | 1 | baari | 2 | | 1 | foo | 2 | | 2 | baari | 2 | | 2 | foo | 2 | | 3 | baz | 2 | | 3 | varten | 2 | + —– + —– + ———- + 6 riviä sarjassa (0,00 sekuntia)
myql>