Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[SQL] Subselect met brede sleutel werkt niet.

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

Verwijderd

Topicstarter
Ik ben voor mezelf bezig SQL beter te leren en als het even kan helemaal te beheersen, helaas zit ik nu met een probleem.

Ik moet de Titel en BeginDatumTijd weergeven uit de tabel Uitvoering, maar dan allen de titel en datums waar nog geen enkele reservering van is. Nu heb ik het wel zo dat hij nu alle uitvoeringen geeft die niet met begindatumtijd in de tabel bezetting zitten, maar als ik nou 2 verschillende voorstellingen (waarvan 1 voorstelling reserveringen heeft, en de andere niet) heb die beide op hetzelfde moment beginnen dan laat hij die andere voorstelling ook niet zien.


SQL: Subselect
1
2
3
4
SELECT Titel, BeginDatumTijd
FROM Uitvoering
WHERE BeginDatumTijd NOT IN (SELECT BeginDatumTijd
                             FROM Bezetting )


Nu heb ik een SQL boek erbij gekocht en daarin staat dat ik met een brede sleutel kan werken, alleen op 1 of andere manier werkt dat niet:


SQL: Subselect met brede sleutel
1
2
3
4
5
SELECT Titel, BeginDatumTijd, Zaalnaam
FROM Uitvoering
WHERE (Titel, BeginDatumTijd) NOT IN (  SELECT  Titel, BeginDatumTijd
                                        FROM    Bezetting 
                                        GROUP BY Titel, BeginDatumTijd)


Nu heb ik ook al zonder die group by geprobeert, maar dan blijf ik dezelfde error houden, namelijk:

code:
1
2
Msg 102, Level 15, State 1, Line 3
Incorrect syntax near ','.


Ik heb ook al redelijk veel gezocht op internet, en zelfs de alternativen werken allemaal niet (een subselect met EXIST, de concatenatietruc). Het is bij deze opdracht niet de bedoeling dat ik gebruik ga maken van een join.

Ik gebruik SQL Server Development Edition versie 9.00.1399.06.

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Een where (not) in sub query mag altijd maar 1 veld terug geven.

Een (NOT) IN operator is niet anders dan de '=', '+' of '<>' operator.

Net zoals je niet kunt aangeven (VeldA, VeldB) = (VeldC, VeldD) kun je ook niet de IN operator op deze manier gebruiken.

Geef de tabel Uitvoering een unieke key (UitvoeringID) en voeg deze tevens toe aan Bezetting.
Daarna kun je de query veranderen naar
SQL:
1
WHER (UitvoeringID NOT IN (SELECT UitvoeringID from Bezetting))


Je hebt dan ook niet meer de group by nodig. De query zal daarna alle uitvoeringen terug geven waarvan nog geen entry in Bezetting aanwezig is.

If it isn't broken, fix it until it is..


Verwijderd

Topicstarter
Het probleem is dat ik ook geen gebruik mag maken van een UItvoeringID, de Primairy Key is Titel met BeginDatumTijd.

Maar wat ik me nog afvraag, je zegt dat het niet mag maar in mijn SQL boek staat dat het zo juist moet. Alleen InterBase kan er niet mee overweg en daar zijn die alternatieven voor.

[ Voor 44% gewijzigd door Verwijderd op 29-01-2008 13:30 ]


  • wboevink
  • Registratie: September 2004
  • Laatst online: 05-11 00:06
WHERE (Titel + BeginDatumTijd) NOT IN ( SELECT Titel + BeginDatumTijd
FROM Bezetting
GROUP BY Titel + BeginDatumTijd)

Maar dat is niet de meest charmante oplossing

[ Voor 33% gewijzigd door wboevink op 29-01-2008 13:39 ]


Verwijderd

Topicstarter
wboevink schreef op dinsdag 29 januari 2008 @ 13:38:
WHERE (Titel + BeginDatumTijd) NOT IN ( SELECT Titel + BeginDatumTijd
FROM Bezetting
GROUP BY Titel + BeginDatumTijd)

Maar dat is niet de meest charmante oplossing
En werkt ook niet, aangezien hij die datetime (BeginDatumTijd) niet kan converteren naar een character string ;)

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Ik weet niet wat sql server ondersteunt in deze, maar in Oracle zou dit gewoon werken.
De group by is wel overbodig vanwege de impliciete distinct door de 'in'.

Who is John Galt?


  • T-8one
  • Registratie: Oktober 2001
  • Laatst online: 19-11 10:41

T-8one

take it easy, take a sisi

En waarom niet gewoon zo?:

SQL:
1
2
3
4
5
6
7
8
SELECT Titel, BeginDatumTijd, Zaalnaam
FROM Uitvoering
WHERE Titel NOT IN (  SELECT    Titel
                                   FROM    Bezetting 
                                   GROUP BY Titel, BeginDatumTijd)
AND begindatumtijd NOT IN ( SELECT begindatumtijd
                                             FROM bezetting
                                             GROUP BY Titel, BeginDatumTijd)

GP 32 the most powerfull handheld in the world :P


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Hm, deze opdracht is nogal raar, en zou ik graag aan de docent teruggeven. Deze dubbele key is vreselijk. Wat nou als dezelfde voorstelling in twee zalen tegelijkertijd begint? Een Id is hier op zijn plaats.

En omdat de opdracht zo raar is, geef ik deze spoiler:

SQL:
1
2
3
4
5
SELECT Titel, BeginDatumTijd
FROM Uitvoering AS u
WHERE NOT EXISTS 
    (SELECT * FROM Bezetting AS b WHERE 
     b.BeginDatumTijd=... AND b.Titel=...)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Verwijderd

Topicstarter
T-8one schreef op dinsdag 29 januari 2008 @ 15:24:
En waarom niet gewoon zo?:

SQL:
1
2
3
4
5
6
7
8
SELECT Titel, BeginDatumTijd, Zaalnaam
FROM Uitvoering
WHERE Titel NOT IN (  SELECT    Titel
                                   FROM    Bezetting 
                                   GROUP BY Titel, BeginDatumTijd)
AND begindatumtijd NOT IN ( SELECT begindatumtijd
                                             FROM bezetting
                                             GROUP BY Titel, BeginDatumTijd)
Op die manier heb ik ook al geprobeert maar dan laat hij de uitvoering niet zien waarbij er geen reserveringen zijn en die dezelfde begindatumtijd heeft als de uitvoering die wel reserveringen heeft.

Ik hoop dat het nog duidelijk is :>

@ hierboven

Inderdaad met een ID zou het veel makkelijker zijn. Maar voor de rest staan er wel meer kromme dingen in mijn boek. Maar ik wil het wel werkend hebben, dus ik probeer nog maar door.

Bedankt voor de spoiler, zo werkt het dus :D, ik zat eerder ook al met die exist te kloten maar toen kreeg ik een vage error. Bedankt ! :)

[ Voor 6% gewijzigd door Verwijderd op 29-01-2008 15:33 ]


  • d00d
  • Registratie: September 2003
  • Laatst online: 16-09 13:23

d00d

geen matches

Je gebruikt SQL Server 2005 en dan kun je ook het volgende doen:
SQL:
1
2
3
select Titel, BeginDatumTijd from dbo.Uitvoering
except
select Titel, BeginDatumTijd from dbo.Bezetting;

42.7 percent of all statistics are made up on the spot.


Verwijderd

Niet oplossen met IN / EXISTS:
SQL:
1
2
3
4
SELECT Uitvoering.Titel, Uitvoering.BeginDatumTijd
FROM Uitvoering
LEFT JOIN Bezetting ON Uitvoering.Titel = Bezetting.Titel AND Uitvoering.BeginDatumTijd = Bezetting.BeginDatumTijd
WHERE Bezetting.Titel IS NULL


maar als je perse wil:
SQL:
1
2
3
SELECT Titel, BeginDatumTijd
FROM Uitvoering
WHERE NOT EXISTS (SELECT 1 FROM Bezetting WHERE Bezetting.Titel = Uitvoering.Titel AND Bezetting.BeginDatumTijd = Uitvoering.BeginDatumTijd)
Pagina: 1