Avatar billede unknown_someone Juniormester
02. september 2006 - 19:04 Der er 6 kommentarer og
1 løsning

left join - mangler data efter where-sætning

bruger denne SQL til at hente data ud fra tabellerne category og sub.

SELECT category.navn, sub.navn, category.online, category.deleted
FROM category LEFT JOIN sub ON category.id = sub.category_id
WHERE (((category.online)=True) AND ((category.deleted)=False));

Problemet er, at også sub.online og sub.deleted skal være henholdsvis true og false, men hvis jeg sætte denne ekstra betingelse på får jeg kun poster retur der opfylder alle fire krav. Hvordan får jeg lavet min SQL så de to sidste betingelser også bliver opfattet som en slags left join?

I Oracle kan man fx skrive sub.deleted(+) = false - men hvordan gøres i Access?
Avatar billede nielle Nybegynder
02. september 2006 - 19:11 #1
Er det denne SQL du forsøger dig med?

SELECT category.navn, sub.navn, category.online, category.deleted
FROM category LEFT JOIN sub ON category.id = sub.category_id
WHERE category.online=True AND category.deleted=False AND sub.online=True AND sub.deleted=False

Hvad eksakt mener du med "... får jeg kun poster retur der opfylder alle fire krav"? Det er jo definitionen af en ADND at alle kravene skal være opfyldt.
Avatar billede unknown_someone Juniormester
02. september 2006 - 19:21 #2
ja - det er den SQL.

hvis jeg kører den sql i mit spørgsmål får jeg følgende retur

category1 | null
category2 | sub1
category2 | sub2
category3 | sub3

kører jeg den SQL du har postet får jeg kun dette retur

category2 | sub1
category2 | sub2

Mit ønske er at få dette retur

category1 | null
category2 | sub1
category2 | sub2
category3 | null

category2 har de to subcategorier, category1 har ingen og category3 subcategory er slettet og skal derfor fremkomme med null.
Avatar billede nielle Nybegynder
02. september 2006 - 19:22 #3
Muligvis sådan:

SELECT category.navn, sub.navn, category.online, category.deleted
FROM category LEFT JOIN sub ON category.id = sub.category_id
WHERE category.online=True AND category.deleted=False AND
(
(sub.online=True AND sub.deleted=False) OR
(sub.online IS Null AND sub.deleted IS NULL)
)
Avatar billede unknown_someone Juniormester
02. september 2006 - 19:25 #4
giver følgende

category1 | null
category2 | sub1
category2 | sub2

altså mangler category3
Avatar billede nielle Nybegynder
02. september 2006 - 19:30 #5
Så må jeg nok erkende at jeg er rimelig blank mht. hvordan løsningen skal se ud. Beklager. :^|
Avatar billede unknown_someone Juniormester
02. september 2006 - 20:04 #6
ser ud til at denne løser problemer

SELECT category.id AS cid, category.navn AS cnavn, sub.id AS sid, sub.navn AS snavn FROM category LEFT JOIN sub ON category.id = sub.category_id WHERE category.online = True AND category.deleted = False AND sub.online = True AND sub.deleted = False UNION ALL SELECT category.id AS cid, category.navn AS cnavn, NULL AS sid, NULL AS snavn FROM category WHERE category.online = True AND category.deleted = False AND id NOT IN (SELECT sub.category_id FROM sub WHERE sub.online = TRUE AND sub.deleted = FALSE) ORDER BY cnavn, snavn
Avatar billede unknown_someone Juniormester
05. september 2006 - 12:42 #7
luk
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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