Ik ben bezig met het ontwikkelen van een programma en merk dat een JOIN niet mijn sterkste kant is.
Ik heb de volgende code:
Die geeft het gewenste resultaat, namelijk:
Maar als ik JOINS denk te begrijpen, zou hij het zelfde resultaat toch ook met een LEFT JOIN moeten geven. Deze query:
Maar die geeft alleen de records weer uit dbo.HorseVersion die ook een gelijke record (dbo.HorseOwner ON dbo.HorseVersion.HorseId = dbo.HorseOwner.HorseId AND dbo.HorseVersion.Modified = dbo.HorseOwner.Modified) in dbo.HorseOwner heeft. En dat wil ik juist niet. Hij moet ook de records uit dbo.HorseVersion laten zien zonder gelijke record uit dbo.HorseOwner. Dit is het resultaat van bovenstaande query:
Het uiteindelijke doel van deze query is om te kijken welke periode een Owner een Horse in bezit heeft gehad. Dit kan met tussenpauzes.
Is de eerste query niet een enorme aanslag op de performance? Waarom werkt de JOIN niet. Kortom... waar ga ik de mist in?
Alvast enorm bedankt!
Ik heb de volgende code:
SQL:
1
2
3
4
5
6
7
| SELECT TOP (100) PERCENT Modified, HorseId, (SELECT TOP (1) OwnerId FROM dbo.HorseOwner WHERE (HorseId = dbo.HorseVersion.HorseId) AND (Modified = dbo.HorseVersion.Modified) AND (OwnerId = 1)) AS OwnerId FROM dbo.HorseVersion WHERE (HorseId = 1) ORDER BY Modified |
Die geeft het gewenste resultaat, namelijk:
code:
1
2
3
4
5
6
7
8
9
10
11
12
| Modified HorseId OwnerId ----------------------- ----------- ----------- 2006-10-20 10:00:00.000 1 1 2006-11-03 12:26:33.733 1 1 2006-11-04 00:12:22.280 1 1 2006-11-06 00:00:00.000 1 1 2006-11-09 00:00:00.000 1 1 2006-11-17 00:00:00.000 1 1 2006-11-30 00:00:00.000 1 NULL 2006-12-01 00:00:00.000 1 1 (8 row(s) affected) |
Maar als ik JOINS denk te begrijpen, zou hij het zelfde resultaat toch ook met een LEFT JOIN moeten geven. Deze query:
SQL:
1
2
3
4
5
6
| SELECT TOP (100) PERCENT dbo.HorseVersion.Modified, dbo.HorseVersion.HorseId, dbo.HorseOwner.OwnerId FROM dbo.HorseVersion LEFT JOIN dbo.HorseOwner ON dbo.HorseVersion.HorseId = dbo.HorseOwner.HorseId AND dbo.HorseVersion.Modified = dbo.HorseOwner.Modified WHERE (dbo.HorseVersion.HorseId = 1) AND (dbo.HorseOwner.OwnerId = 1 OR dbo.HorseOwner.OwnerId IS NULL) ORDER BY dbo.HorseVersion.Modified |
Maar die geeft alleen de records weer uit dbo.HorseVersion die ook een gelijke record (dbo.HorseOwner ON dbo.HorseVersion.HorseId = dbo.HorseOwner.HorseId AND dbo.HorseVersion.Modified = dbo.HorseOwner.Modified) in dbo.HorseOwner heeft. En dat wil ik juist niet. Hij moet ook de records uit dbo.HorseVersion laten zien zonder gelijke record uit dbo.HorseOwner. Dit is het resultaat van bovenstaande query:
code:
1
2
3
4
5
6
7
8
9
10
11
| Modified HorseId OwnerId ----------------------- ----------- ----------- 2006-10-20 10:00:00.000 1 1 2006-11-03 12:26:33.733 1 1 2006-11-04 00:12:22.280 1 1 2006-11-06 00:00:00.000 1 1 2006-11-09 00:00:00.000 1 1 2006-11-17 00:00:00.000 1 1 2006-12-01 00:00:00.000 1 1 (7 row(s) affected) |
Het uiteindelijke doel van deze query is om te kijken welke periode een Owner een Horse in bezit heeft gehad. Dit kan met tussenpauzes.
Is de eerste query niet een enorme aanslag op de performance? Waarom werkt de JOIN niet. Kortom... waar ga ik de mist in?
Alvast enorm bedankt!