Na lang puzzelen en veel zoeken komen wij niet uit een op een eerste gezicht gemakkelijk SQL probleem. We hebben een MS SQL database met daarin de volgende (relevante) tabellen:
item (Id, Datum, ...) PK: Id
subItem(Id, ItemId, BeginTijd, ...) PK: Id, FK: ItemId -> item.Id
item - subitem is een one-to-many relatie.
(PK staat voor Primary Key en FK staat voor Foreign Key)
We willen graag het volgende weten van de database: alle (distinct) item.Id gesorteerd op item.Datum en als tweede gesorteerd op subItem.BeginTijd en waarbij de item.Datum in een range zit.
De volgende queries bleken niet goed te zijn:
Het blijkt dat top verplicht is als je een distinct uitvoert waarbij er een top in de subquery staat.
Daarnaast is het onmogelijk om een order by te doen, waarbij je het resultaat niet weergeeft in de select. Door deze tweede regel die MS SQL heeft, is het ons niet gelukt om goed te sorteren op, ten eerste item.Datum en daarnaast subItem.BeginTijd. Als we namelijk sorteren op Begintijd in de subquery en daarna sorteren op iets anders, dan is de eerste sortering ongedaan gemaakt. (zeer logisch). Echter kan je subItem.BeginTijd niet als resultaat teruggeven, want dan werkt de distinct op een andere manier. (Distinct is distinct op alle velden en we willen alleen de item.Id distinct hebben en de rest niet. Dus alle dubbele item.Id's mogen worden verwijderd, zolang er maar gesorteerd is op datum en secundair begintijd van het subitem.)
Hopelijk zijn wij duidelijk genoeg en kan iemand van jullie ons helpen met het oplossen van dit probleem.
item (Id, Datum, ...) PK: Id
subItem(Id, ItemId, BeginTijd, ...) PK: Id, FK: ItemId -> item.Id
item - subitem is een one-to-many relatie.
(PK staat voor Primary Key en FK staat voor Foreign Key)
We willen graag het volgende weten van de database: alle (distinct) item.Id gesorteerd op item.Datum en als tweede gesorteerd op subItem.BeginTijd en waarbij de item.Datum in een range zit.
De volgende queries bleken niet goed te zijn:
code:
1
2
3
4
5
6
7
8
9
10
11
| SELECT DISTINCT i.Id, i.Datum
FROM item i, subItem s
WHERE EXISTS(
SELECT TOP 100 PERCENT i.Id, i.Datum, s.BeginTijd
FROM item i, subitem s
WHERE i.Datum BETWEEN '12-12-02' AND '12-12-05'
AND i.Id = s.ItemId
ORDER BY s.BeginTijd
)
AND i.Id = s.ItemId
ORDER BY i.Datum |
Het blijkt dat top verplicht is als je een distinct uitvoert waarbij er een top in de subquery staat.
Daarnaast is het onmogelijk om een order by te doen, waarbij je het resultaat niet weergeeft in de select. Door deze tweede regel die MS SQL heeft, is het ons niet gelukt om goed te sorteren op, ten eerste item.Datum en daarnaast subItem.BeginTijd. Als we namelijk sorteren op Begintijd in de subquery en daarna sorteren op iets anders, dan is de eerste sortering ongedaan gemaakt. (zeer logisch). Echter kan je subItem.BeginTijd niet als resultaat teruggeven, want dan werkt de distinct op een andere manier. (Distinct is distinct op alle velden en we willen alleen de item.Id distinct hebben en de rest niet. Dus alle dubbele item.Id's mogen worden verwijderd, zolang er maar gesorteerd is op datum en secundair begintijd van het subitem.)
Hopelijk zijn wij duidelijk genoeg en kan iemand van jullie ons helpen met het oplossen van dit probleem.