Avatar billede ttopholm Nybegynder
12. september 2005 - 23:50 Der er 7 kommentarer og
1 løsning

Hvordan kringler jeg den her:

Jeg har denne sætning:

SQL = "SELECT a.albumnavn AS albumnavn, a.id AS id, COUNT(b.album_id) as antal FROM album a, betalingslog b WHERE a.band_id = " & session("bandid") & " AND a.id = b.album_id AND status = 1 GROUP BY b.album_id"

Den virker også efter hensigten, men f.eks hvis der ingen records der matcher det i betalingslog viser den det ikke, det er jo klart..

men er der en måde jeg kan gøre så den både viser dem hvis der en match og hvis der ingen, så altså Count returnere 0 istedet for at ikke tage recorden med...
Avatar billede ldanielsen Nybegynder
13. september 2005 - 06:45 #1
Ja, du skal bruge er OUTER JOIN i setdet for det INNER JOIN du bruger:

SQL =
"

SELECT album.albumnavn, album.id, COUNT(betalingslog.album_id) as antal FROM album LEFT OUTER JOIN betalingslog ON
album.id = betalingslog.album_id
WHERE album.band_id = " & session("bandid") & " AND status = 1 GROUP BY b.album_id


"
Avatar billede ttopholm Nybegynder
13. september 2005 - 07:40 #2
ser ud til at virke ;-)

Smid et svar....
Avatar billede ttopholm Nybegynder
13. september 2005 - 07:43 #3
Jeg har en lign. sætning der skal jeg vil gøre det samme..

SQLstmt = "SELECT SUM(ol.pris*ol.antal) AS sum, COUNT(DISTINCT(o.ordreid)) AS antalordre FROM kunde k, Ordre o, Ordrelinie ol WHERE k.FirmaID = " & Session("FirmaID") & "AND  o.KundeID = k.KundeID AND DatePart(mm, o.Ordredato) = " & I & " AND DatePart(yyyy, o.Ordredato) = " & aar & " AND o.Status = 'FAK' AND ol.OrdreID = o.OrdreID"
Avatar billede ttopholm Nybegynder
13. september 2005 - 07:44 #4
hvor den ikke vil vise dem, hvis der ingen match er i ordrelinie.. selv om den skal vise dem
Avatar billede ldanielsen Nybegynder
13. september 2005 - 11:06 #5
LEFT OUTER JOIN:

SELECT ...
FROM
Table1 LEFT OUTER JOIN Table2
ON Table1.Col = Table2.Col
WHERE ...

Du joiner to tabeller, og idet du bruger LEFT (ikke RIGHT) fortæller du at det er den venstre tabel der er styrende. Det vil sige at du får alle poster fra den venstre tabel, og kun de poster fra den højre hvor der findes et match.

ON angiver at du nu fortæller hvordan tabellerne skal joines; her skal Table1.Col = Table2.Col

Så dit eksempel bliver:

SQLstmt = "SELECT SUM(ol.pris*ol.antal) AS sum,
COUNT(DISTINCT(o.ordreid)) AS antalordre
FROM
Kunde INNER JOIN Ordre ON Kunde.KundeID = Ordre.KundeID
LEFT OUTER JOIN Ordrelinie ON Ordrelinie.OrdreID = Ordre.OrdreID
WHERE Kunde.FirmaID = " & Session("FirmaID") & "
AND DatePart(mm, Ordre.Ordredato) = " & I & "
AND DatePart(yyyy, Ordre.Ordredato) = " & aar & "
AND Ordre.Status = 'FAK'"
Avatar billede ldanielsen Nybegynder
13. september 2005 - 11:09 #6
Bemærk at Ordrelinie.OrdreID = Ordre.OrdreID og Kunde.KundeID = Ordre.KundeID fjernes fra WHERE-afdelingen af sætningen, og i stadet angives med ON.

Første del af JOIN'et, INNER JOIN, svarer præcis til det du plejer at lave med komma ellem tabellerne. Den systaks jeg bruger er efter min mening mere overskuelig når man først har lært at bruge den, og jeg er ikke klar over om det overhovedet kan lade sig gøre at lave OUTER JOIN's med din syntaks
Avatar billede ttopholm Nybegynder
13. september 2005 - 11:17 #7
Nice...

Skal nok læse om det lidt mere
Avatar billede claesdamlund Nybegynder
14. september 2005 - 21:40 #8
I MS SQL kan du Outer Joine i Where vha en asterix:

...AND ol.OrdreID =* o.OrdreID"

Asterixen skal være umiddelbart ved siden af lig-med tegnet, på den siden hvor din styrende tabel i Outer Joinen er nævnt.

Det er ikke standard SQL, så brug så vidt muligt Idas syntaks, som følger ANSI 92 standarden.
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
Computerworld tilbyder specialiserede kurser i database-management

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