[SQL] waarden eerste tabel weglaten adv tweede tabel

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Yoki1985
  • Registratie: Augustus 2007
  • Laatst online: 07:44
Ik heb 2 tabelen nl:

Tabel (T_regio) voor de regio info
regio_id regio
-----------------------------------------
1 limburg
2 antwerpen
3 vlaams brabant
4 oost vlaanderen
5 west-vlaanderen
6 belgië

Tabel (t_curvit_regio) voor de koppeling tussen de regio en de student
id regio_id student_id
------------------------------------------------------------------
1 1 1
1 6 1

Nu wil ik een lijst weergeven van de nog niet gekoppelde regio's. maw de output moet hetvolgende zijn:

regio_id regio
-----------------------------------------
2 antwerpen
3 vlaams brabant
4 oost vlaanderen
5 west-vlaanderen

Echter dit krijg ik niet klaar in 1 stored procedure.

Hetgeen ik momenteel heb is hetvolgende:

code:
1
2
3
4
5
SELECT T_regio.regio, T_regio.regio_id 
FROM T_regio
    INNER JOIN t_curvit_regio
    ON t_regio.regio_id = t_curvit_regio.regio_id
WHERE t_curvit_regio.student_id = '1'


Echter hier maakt hij een cartesiaans product van.

Output
regio_id regio
-----------------------------------------
2 antwerpen
3 vlaams brabant
4 oost vlaanderen
5 west-vlaanderen
6 belgië
1 limburg
2 antwerpen
3 vlaams brabant
4 oost vlaanderen
5 west-vlaanderen

Kan mij iemand helpen met de Query?

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:18
Je zult een subquery moeten gebruiken.

code:
1
select * from regio where regioid not in ( select regio_id from koppeltabel )

Dat is het idee... Aan jou om het naar jouw situatie te vertalen. ;)

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • DamadmOO
  • Registratie: Maart 2005
  • Laatst online: 23-09 22:37
Kijk eens naar een van de volgende SQL keywords
  • Subquery (in combinatie met een NOT IN)
  • Exists / Not exists
  • Left Join met een filter in de where class
Met alle 3 de manieren kan het, als je er na het bekijken van de documentatie nog niet uit komt zeg dan even waar je vast loopt.

Spuit 11 (maar wel meer opties)

[ Voor 12% gewijzigd door DamadmOO op 16-01-2009 11:19 ]


Acties:
  • 0 Henk 'm!

  • freak-ish
  • Registratie: December 2008
  • Laatst online: 15-01 17:16
Select bla bla
From
t_regio a LEFT OUTER JOIN t_curvit_regio b ON a.t_regio_id = b.t_regio_id
Where
b.t_regio_id IS NULL

Kan ook, heb je ook geen sub-query nodig. Bij grote tabellen kan dit weer performance schelen.

[ Voor 27% gewijzigd door freak-ish op 16-01-2009 11:25 ]


Acties:
  • 0 Henk 'm!

  • Yoki1985
  • Registratie: Augustus 2007
  • Laatst online: 07:44
whoami schreef op vrijdag 16 januari 2009 @ 11:12:
Je zult een subquery moeten gebruiken.

code:
1
select * from regio where regioid not in ( select regio_id from koppeltabel )

Dat is het idee... Aan jou om het naar jouw situatie te vertalen. ;)
Bedankt dit heeft mij eruitgeholpen. mijn query nu:

code:
1
2
3
4
5
6
7
8
SELECT T_regio.regio, T_regio.regio_id 
FROM T_regio
WHERE T_regio.regio_id  NOT IN (
    SELECT T_regio.regio_id 
    FROM T_regio
        INNER JOIN t_curvit_regio
        ON t_regio.regio_id = t_curvit_regio.regio_id
    WHERE t_curvit_regio.student_id = @student_id)

Acties:
  • 0 Henk 'm!

  • freak-ish
  • Registratie: December 2008
  • Laatst online: 15-01 17:16
yoki2007 schreef op vrijdag 16 januari 2009 @ 11:25:
[...]


Bedankt dit heeft mij eruitgeholpen. mijn query nu:

code:
1
2
3
4
5
6
7
8
SELECT T_regio.regio, T_regio.regio_id 
FROM T_regio
WHERE T_regio.regio_id  NOT IN (
    SELECT T_regio.regio_id 
    FROM T_regio
        INNER JOIN t_curvit_regio
        ON t_regio.regio_id = t_curvit_regio.regio_id
    WHERE t_curvit_regio.student_id = @student_id)
Waarom zo complex? 8)7 Maar ja, als 't werkt.... :)

Acties:
  • 0 Henk 'm!

  • Yoki1985
  • Registratie: Augustus 2007
  • Laatst online: 07:44
Ik heb jouw query bekeken freak-ish en het doet idd hetzelfde.

Maar jouw oplossing snap ik niet helemaal.

Hoe kom je aan die WHERE?

PS: als ik jouw query gebruik kan ik toch niet filteren op student_id, ofwel?

[ Voor 35% gewijzigd door Yoki1985 op 16-01-2009 11:38 ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:18
freak-ish schreef op vrijdag 16 januari 2009 @ 11:23:
Select bla bla
From
t_regio a LEFT OUTER JOIN t_curvit_regio b ON a.t_regio_id = b.t_regio_id
Where
b.t_regio_id IS NULL

Kan ook, heb je ook geen sub-query nodig. Bij grote tabellen kan dit weer performance schelen.
Hmm, een beetje DBMS systeem zorgt er wel voor dat het meest efficiente execution plan gebruikt wordt.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • freak-ish
  • Registratie: December 2008
  • Laatst online: 15-01 17:16
yoki2007 schreef op vrijdag 16 januari 2009 @ 11:35:
Ik heb jouw query bekeken freak-ish en het doet idd hetzelfde.

Maar jouw oplossing snap ik niet helemaal.

Hoe kom je aan die WHERE?

PS: als ik jouw query gebruik kan ik toch niet filteren op student_id, ofwel?
Een WHERE statement kun je zien als een filter, dus bij een WHERE kun je ook zetten:

WHERE
student_id = x (let wel even op of de student_id uit table a of b komt)

LEFT OUTER JOIN = alles van de linker table en alleen de data van b waar ...
x.id = y.id .. de id's hetzelfde zijn.

door nu te zeggen y.id IS NULL wordt gekeken naar de waardus van tabel x die NIET in y voorkomen. NULL staat voor leeg veld. It is ene klein truckje maar ik gebruik het vaan in onze DWH omgeving (DB2 currently).

En ja, een goed ingerichte omgeving zal zelf de juiste links leggen en temp indices creeren, maar helaas...het werkt niet altijd zo mooi als in theorie.

Acties:
  • 0 Henk 'm!

  • DamadmOO
  • Registratie: Maart 2005
  • Laatst online: 23-09 22:37
yoki2007 schreef op vrijdag 16 januari 2009 @ 11:25:
[...]


Bedankt dit heeft mij eruitgeholpen. mijn query nu:

code:
1
2
3
4
5
6
7
8
SELECT T_regio.regio, T_regio.regio_id 
FROM T_regio
WHERE T_regio.regio_id  NOT IN (
    SELECT T_regio.regio_id 
    FROM T_regio
        INNER JOIN t_curvit_regio
        ON t_regio.regio_id = t_curvit_regio.regio_id
    WHERE t_curvit_regio.student_id = @student_id)
Waarom join je in de subquery weer met de T_Regio tabel? Het enige wat je wilt hebben is je Regio_ID welke ook in de T_Curvit_Regio staat.

yoki2007 schreef op vrijdag 16 januari 2009 @ 11:35:
Ik heb jouw query bekeken freak-ish en het doet idd hetzelfde.

PS: als ik jouw query gebruik kan ik toch niet filteren op student_id, ofwel?
Dat kan dus wel door een extra filter in je join te gebruiken. Het wordt dan iets als
SQL:
1
2
3
4
5
SELECT Regio_ID, Regio
FROM T_Regio AS R
LEFT OUTER JOIN T_Curvit_Regio AS CR ON R.Regio_id = CR.Regio_id 
    AND CR.Student_ID = @Student_ID
WHERE CR.Regio_ID IS NULL
Pagina: 1