ASP.NET SQL Server Query probleem

Pagina: 1
Acties:

  • Gadgets
  • Registratie: Juni 2006
  • Laatst online: 06-01 23:59
Ik heb de volgende 3 tabellen:

tblNews (NewsID,Title,Body)
tblOrganisation (OrgID,Name)
tblNewsOrganisation (NewsID,OrgID,Title,Body)

Nu wil ik een overzicht van de nieuwsberichten hebben die alleen zijn gekoppeld aan mijn eigen organisation, die dus niet vaker gekoppeld zijn aan andere organistaties via de koppel tabel tblNewsOrganisation. Het idee hier achter is dat je alleen nieuws mag wijzigen die alleen aan je eigen organisatie is gekoppeld.

Nu krijg ik het maar niet voor elkaar via SQL ik zal zo ff de query posten die ik nu heb (staat op server)

Als iemand een briljante oplossing heeft : >:)

  • Mike78
  • Registratie: September 2000
  • Laatst online: 14:49

Mike78

Always

SQL:
1
2
3
4
5
select newsid, title,body
from tblnews n
inner join tblnewsorganisation no on no.newsid = n.newsid
where no.newsid not in (select newsid from tblnewsorganisation where orgid <> eigenorganisatie)
and no.orgid = eigenorganisatie


Alleen klopt de tabeldefinitie van newsorganisatie niet helemaal, zoals hij in je post staat.

edit:

Aangepast aan aangepaste definities

[ Voor 22% gewijzigd door Mike78 op 24-07-2006 17:15 ]

24 uur per dag, 24 biertjes in een krat. Toeval?


  • Gadgets
  • Registratie: Juni 2006
  • Laatst online: 06-01 23:59
Mike78 schreef op maandag 24 juli 2006 @ 17:10:
SQL:
1
2
3
4
5
select newsid, title,body
from tblnews n
inner join tblnewsorganisation no on ???
where no.newsid not in (select newsid from tblnewsorganisation where orgid <> eigenorganisatie
and no.orgid = eigenorganisatie


Alleen klopt de tabeldefinitie van newsorganisatie niet helemaal, zoals hij in je post staat.
klopt aangepast!

  • Gadgets
  • Registratie: Juni 2006
  • Laatst online: 06-01 23:59
code:
1
2
3
4
5
select n.*
from tblNews as n
inner join tblNewsWorkorganisation as nw on nw.NewsID = n.NewsID
where nw.NewsID not in (select NewsID from tblNewsWorkorganisation where WorkID <> @WorkID) 
and nw.WorkID = @WorkID


het werkt!! thanx!

maarum ik hoorde dat not in wel traag kan zijn is dat zo?

  • BCC
  • Registratie: Juli 2000
  • Laatst online: 14:02

BCC

Als je 2e select groot is, moet hij voor elke query elke row van die 2e select matchen aan elke elke row jouw "not in" lijst (je 1e select met join). Dat kan idd nogal traag worden bij grote lijsten.

[ Voor 32% gewijzigd door BCC op 24-07-2006 17:57 ]

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


Verwijderd

Gadgets schreef op maandag 24 juli 2006 @ 17:03:
Als iemand een briljante oplossing heeft : >:)
Is dit briljant?

SQL:
1
2
3
4
5
6
7
8
SELECT tblNews.*
FROM tblNews
RIGHT JOIN 
  ( SELECT NewsId, AVG(OrgID)
    FROM tblNewsOrganisation
    GROUP BY NewsId
    HAVING AVG(OrgID)=@EigenOrganisatie
  ) tabel1 ON tblNews.NewsID=tblNewsOrganisation.NewsID


edit:
Volgens mij is die AVG niet helemaal betrouwbaar, omdat een OrgID een veelvoud van EigenOrganisatie zou kunnen zijn. Het gaat ff om het idee. Met een kleine aanpassing wordt de query vast nog briljanter.

[ Voor 23% gewijzigd door Verwijderd op 24-07-2006 22:09 ]


  • BCC
  • Registratie: Juli 2000
  • Laatst online: 14:02

BCC

Verwijderd schreef op maandag 24 juli 2006 @ 22:04:
[...]

Volgens mij is die AVG niet helemaal betrouwbaar, omdat een OrgID een veelvoud van EigenOrganisatie zou kunnen zijn. Het gaat ff om het idee. Met een kleine aanpassing wordt de query vast nog briljanter.[/edit]
Dat niet alleen, als een Nieuwsbericht van 1, 2 en 3 is, dan issie volgens jouw van 2. Daarnaast moet je voor een AVG query toch alle rows door, dus zal het niets sneller zijn. Dan kun je beter in je subquery NewsID groupen en counten en checken of het 1 is.

[ Voor 8% gewijzigd door BCC op 24-07-2006 22:19 ]

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

ids: 1, 2, 4
AVG geeft 2.33333333 ;)

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • BCC
  • Registratie: Juli 2000
  • Laatst online: 14:02

BCC

kenneth schreef op maandag 24 juli 2006 @ 22:19:
ids: 1, 2, 4
AVG geeft 2.33333333 ;)
Hoe is deze reply zinnig? Natuurlijk gaat het soms wel goed, maar dat lijkt me niet verstandig om op te gokken :X

Maar zoiets:

SQL:
1
2
3
4
5
SELECT *,O.OrgID as orgCount from tblNews N, tblOrganisation O, tblNewsOrginazation NO
WHERE 
N.NewsID = NO.NewsID AND
NO.OrgID = O.OrgID
GROUP BY orgCount


Dan moet je met een extra query of in je PHP de dingen met orgCount > 1 eruit schoppen

[ Voor 67% gewijzigd door BCC op 24-07-2006 22:29 ]

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


Verwijderd

Gadgets schreef op maandag 24 juli 2006 @ 17:03:
Als iemand een briljante oplossing heeft : >:)
Is deze nu wel briljant genoeg :>?

SQL:
1
2
3
4
5
6
7
8
9
SELECT tblNews.*
FROM tblNews
RIGHT JOIN 
  ( SELECT NewsId, MIN(OrgID)
    FROM tblNewsOrganisation
    GROUP BY NewsId
    HAVING MIN(OrgID)=@EigenOrganisatie
    AND MAX(OrgID)=@EigenOrganisatie
  ) tabel1 ON tblNews.NewsID=tabel1.NewsID

Volgens mij kan deze query met slim gebruik van indexen (index scan/seek) wel sneller zijn.

[ Voor 76% gewijzigd door Verwijderd op 24-07-2006 23:11 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
SQL:
1
2
3
4
5
SELECT *
FROM tblNews N
INNER JOIN tblNewsOrganisation NOrg ON N.NewsId = Norg.NewsId AND NOrg.OrgID = 1
LEFT OUTER JOIN tblNewsOrganisation NOrg2 ON N.NewsId = NOrg2.NewsId AND NOrg2.OrgId <> 1
WHERE Norg2.NewsId IS NULL


Hierbij is OrgId 1 de eigen organisatie.

Met de eerste INNER JOIN selecteer je je 'eigen' nieuws. De left outer join met dezelfde tabel icm met de IS NULL in de WHERE haalt nieuws die aan een andere OrgId zitten eruit.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 17-12-2025

curry684

left part of the evil twins

Verwijderd schreef op maandag 24 juli 2006 @ 22:44:
[...]

Is deze nu wel briljant genoeg :>?

SQL:
1
2
3
4
5
6
7
8
9
SELECT tblNews.*
FROM tblNews
RIGHT JOIN 
  ( SELECT NewsId, MIN(OrgID)
    FROM tblNewsOrganisation
    GROUP BY NewsId
    HAVING MIN(OrgID)=@EigenOrganisatie
    AND MAX(OrgID)=@EigenOrganisatie
  ) tabel1 ON tblNews.NewsID=tabel1.NewsID

Volgens mij kan deze query met slim gebruik van indexen (index scan/seek) wel sneller zijn.
Highly doubt it, het gebruik van een having-clause sluit de subquery uit van optimalisatie in de outer query, terwijl SQL Server daar in Mike78's variant afaics minder problemen mee zal hebben. Ik ben overigens zeer zeker benieuwd naar de vergelijkende execution plans wat dat betreft.

Professionele website nodig?

Pagina: 1