12. september 2005 - 23:50Der 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...
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
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"
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'"
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
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.
Synes godt om
Ny brugerNybegynder
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.