[MSSQL] Left outer join

Pagina: 1
Acties:
  • 133 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • Padschild
  • Registratie: September 2004
  • Laatst online: 28-11-2020
Hey mensen,

Ik heb de volgende tabellen:

MenuCategories
CategoryID (PK)
CategoryName

PagesPublished
PageID (PK)
CategoryID (PK)


En PageID komt hieruit:

Pages
PageID (PK)
PageName


(sommige velden zijn weggelaten omdat deze niet interressant zijn voor de query)

Wat nu de bedoeling is, is dat een pagina gepubliceerd kan worden in een category, maar dat 1 pagina maar 1 keer gepubliceerd kan worden. Daarom ook de PK als een gemeenschappelijke sleutel. Nu wil ik echter in een dropdown list een lijstje laten zien, waar de pagina nog gepubliceerd kan worden, zonder de categorien waar deze natuurlijk al is gepubliceerd.

Ik begon gewoon met een query met inner join, wat natuurlijk niet ging werken, omdat niet elke Categorie een gepubliceerde item hoeft te bevatten. Daarom ging ik verder met een LEFT OUTER JOIN, wat nu bijna werkt:

SQL:
1
2
3
4
5
6
7
8
SELECT 
MenuCategories.CategoryID, MenuCategories.CategoryName
FROM         
MenuCategories 
LEFT OUTER JOIN                     
PagesPublished ON MenuCategories.CategoryID = PagesPublished.CategoryID
WHERE     
(PagesPublished.PageID <> @PageID OR PagesPublished.PageID IS NULL) 


@PageID wordt geleverd door de dropdownbox, om te bepalen om welke pagina het nu gaat. De bedoeling is dat de categorien waarin de pagina al gepubliceerd is, niet voorkomen in de result van de query.

Het probleem zit erin, dat hij ook dubbele CategoryID's laat zien als er verschillende pagina's in een Category zijn gepublished, dit heb ik opgelost door middel van distinct. Het echte probleem schuif ik echter alleen maar naar voren; als er meerdere pagina's in een categorie gepubliceerd zijn, komt de categorie nog gewoon voor in de result, ook al is de pagina waarom het draait daar al in gepubliceerd.

Dit komt natuurlijk omdat ik moet zoeken of de combinatie van PageID en CategoryID voorkomt in PagesPublished, om dan de desbetreffende Category weglaten. Ik heb alleen geen idee hoe ik dit in een goede query moet zetten. Zit ik in de goede richting en heeft iemand een idee?

Acties:
  • 0 Henk 'm!

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

SQL:
1
2
3
4
5
SELECT m.CategoryID, m.CategoryName
FROM MenuCategories m
LEFT OUTER JOIN PagesPublished p
  ON (m.CategoryID = p.CategoryID AND p.PageID = @PageID)
WHERE p.PageID IS NULL

Today's subliminal thought is:


Acties:
  • 0 Henk 'm!

  • Padschild
  • Registratie: September 2004
  • Laatst online: 28-11-2020
Thanks :)

Niet bij stil gestaan dat je op die manier kon joinen, weer wat bijgeleerd :D

Harstikke bedankt !