Avatar billede bernhof Nybegynder
22. august 2004 - 16:46 Der er 6 kommentarer og
1 løsning

SQL Query

Jeg har lidt problemer med at gennemskue, hvordan jeg skal opbygge min SQL query. Hvis vi ser på en ultra simpel udgave af mit problem, hvor jeg har to tabeller:

"Tabel1" med feltet: "id" (autonummer, primary key)
"Tabel2" med felterne: "id" (autonummer, primary key) og "ref" (tal)

Feltet "ref" i Tabel2 indeholder et tal, som er en henvisning til feltet "id" i Tabel1 (mener det hedder foreign key).

Mit problem er som følger:

Jeg vil gerne udskrive alle records fra Tabel1, og samtidig udskrive, hvor mange records i Tabel2 der i feltet "ref" henviser til hver enkelt record i Tabel1.

Et eksempel:

Tabel1:
---------
id
1
2
3

Tabel2:
---------
id    ref
1      1
2      1
3      3
4      1

Visning:
---------
id: 1, antal henvisninger: 3
id: 2, antal henvisninger: 0
id: 3, antal henvisninger: 1

Jeg ville gerne kunne løse dette problem med én enkelt SQL sætning, og her snakker vi IKKE MS SQL! Jeg arbejder med god gammeldags MS Access SQL. Kan det lade sig gøre?

Håber I forstår - og på forhånd tak,
Mikkel
Avatar billede eagleeye Praktikant
22. august 2004 - 16:50 #1
Prøv sådan her:

sql = "select tabel1.id, count(tabel2.ref) as antal from tabel1 inner join tabel2 on tabel1.id=tabel2.ref group by tabel1.id"
Avatar billede eagleeye Praktikant
22. august 2004 - 17:14 #2
Så kan du udskrive det sådan her:


sql = "select tabel1.id, count(tabel2.ref) as antal from tabel1 inner join tabel2 on tabel1.id=tabel2.ref group by tabel1.id"
set rs = Conn.Execute(sql)

do while not rs.EOF
  Response.write "id: " & rs("id") & ", antal henvisninger: " & rs("antal") & "<br>"
  rs.Movenext
loop
Avatar billede bernhof Nybegynder
22. august 2004 - 18:59 #3
Jeg takker mange gange :)

Prøvede noget næsten identisk med hvad du skriver - manglede bare Group By ..

Læg et svar!
Avatar billede bernhof Nybegynder
22. august 2004 - 19:02 #4
Næ, forresten - jeg fik det til at virke, men jeg skulle ændre Inner Join til Left Join, da jeg også ville kunne vise records, der har 0 henvisninger i tabel2. Så er det sagt :) Men du skal da stadig have point!
Avatar billede bernhof Nybegynder
22. august 2004 - 19:14 #5
Hmm. Det virkede vist kun i den simple udgave, og ikke i den virkelig verden :) Jeg bliver lige nødt til at spørge yderligere:

Hvis nu vi tilføjer et "ref"-felt til Tabel1, og ser på en ny Tabel3, som har feltet "id" og "titel". tabel1.ref henviser altså til tabel3.id, og Tabel3.titel skal udskrives sammen med det andet. Min query ser nu således ud:

select tabel1.id, tabel3.titel, count(tabel2.ref) as antal from (tabel1 inner join tabel3 on tabel1.ref=tabel3.id) left join tabel2 on tabel1.id=tabel2.ref group by tabel1.id

.. så opstår der en fejl:

"You tried to execute a query that does not include the specified expression 'titel' as part of an aggregate function."

Hvordan fixer man så lige denne?
Avatar billede eagleeye Praktikant
22. august 2004 - 19:27 #6
JA det rigtigt med left join den også dem med for tallet vil give 0 :)

Du skal som minimum havde alle kolonnerne med i group by som du vil havde ud, når du har en count :) Det kan også lade sig gøre i den virkelige verden, hvis man stille spørgsmålet så det passet med virkeligheden :)

Prøv sådan her:

sql = "select tabel1.id, tabel3.title, count(tabel2.ref) as antal tabel1.id from (tabel1 LEFT JOIN tabel2 ON tabel1.id = tabel2.ref) INNER JOIN tabel3 ON tabel1.ref = tabel3.id group by tabel1.id, tabel3.title"
Avatar billede bernhof Nybegynder
22. august 2004 - 19:58 #7
Perfekt - så var den der!

Ja, det var nu heller ikke det jeg mente med den virkelige verden, men du forstår nok :)

Jeg takker, og her er så dine point!
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester