15. april 2004 - 15:59Der er
2 kommentarer og 1 løsning
count(distinct) giver 0
Hej der...
Jeg har en lille sql streng, der gerne skulle give mig nogle talvaerdier til noget statistik... Det fungerer ogsa i udgangpunktet godt nok - dog ikke, hvis en af de forespurgte tabeller ingen records har, saa bliver alle returnerede vaerdier 0. Hvordan kan det vaere - og kan man omgaa det?
Min SQL: SELECT COUNT(r_id), COUNT(DISTINCT rc_referralid), COUNT(DISTINCT c_id), COUNT(DISTINCT s_id) FROM referral_referrals,referral_referral_contractors,referral_contractors,referral_surveys"
Tabellen referral_surveys har ingen records. Undlades denne taelles der rigtigt op...
Den måde du har skrevet den sql på, kan lægge enhver server ned - og vil gøre det såfremt der er ret mange data i tabellerne.
Du har nemlig ikke angivet join-kriterier i mellem tabellerne - dermed siger du, at SQL Server skal gange antallet af rækker i hver tabel med antallet af rækker i de øvrige tabeller. Det kaldes en CROSS JOIN eller et kartesisk produkt.
Er der blot 10 rækker i hver af dine tabeller bliver det til 10x10x10x10 = 10.000 rækker som skal optælles. Med 1000 rækker i hver bliver det ganske uhyggeligt!
Det er også derfor du har opdaget at du skal bruge COUNT(DISTICT x) for at undgå dubletterne i optællingen - men det gør faktisk belastningen af serveren værre da de mange mange rækker nu skal sorteres af SQL Server.
Hvis det du forsøger er at få optalt antal rækker i hver tabel for sig og få samlet resultatet i en række - så vil nedenstående virke væsentlig bedre, samt løse dit problem med 0 rækker:
select (select count(*) from referral_referrals) as RR, (select count(*) from referral_referrals_contractors) as RRC, (select count(*) from referral_contractors) as RC, (select count(*) from referral_surveys) as RS
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.