Ik zit met een vreemd verschijnsel. Ik zal wel iets over het hoofd zien, maar een query doet in MS SQL niet wat ik verwacht:
Probleem: Ik heb een table met filenames uit projecten van verschillende versies:
Zoals verwacht vormen deze drie kolommen de PK en zijn projectid en versionid FK's. Er zijn ook nog wat andere kolommen, maar die doen er even niet toe.
Ik wil nu weten welke files in versie 2 zijn verwijderd, tov versie 1. Dus alle versie 1's, waarvoor geen versie 2 kan worden gevonden. Dus een left outer join, waarbij de rechter table NULL is... Dus:
Ik verwacht hier dus alle files die wel in versie 1 zitten en niet in versie 2. Tot mijn verassing krijg ik echter niks terug (0 records). Als ik de "b.versionid is NULL" weghaal uit de where clause, zie ik dat ik gewoon de inner join terug krijg... Wat zie ik over het hoofd?
Probleem: Ik heb een table met filenames uit projecten van verschillende versies:
| projectid | versionid | filename |
|---|---|---|
| 1 | 1 | myfile.txt |
| 1 | 1 | deleted.txt |
| 1 | 2 | myfile.txt |
Zoals verwacht vormen deze drie kolommen de PK en zijn projectid en versionid FK's. Er zijn ook nog wat andere kolommen, maar die doen er even niet toe.
Ik wil nu weten welke files in versie 2 zijn verwijderd, tov versie 1. Dus alle versie 1's, waarvoor geen versie 2 kan worden gevonden. Dus een left outer join, waarbij de rechter table NULL is... Dus:
SQL:
1
2
3
4
5
6
7
8
9
10
| select a.* from FILES a left outer join FILES b on a.projectid = b.projectid and a.filename = b.filename where a.versionid = 1 and b.versionid = 2 and a.projectid = 1 and b.versionid is NULL |
Ik verwacht hier dus alle files die wel in versie 1 zitten en niet in versie 2. Tot mijn verassing krijg ik echter niks terug (0 records). Als ik de "b.versionid is NULL" weghaal uit de where clause, zie ik dat ik gewoon de inner join terug krijg... Wat zie ik over het hoofd?
edit:
Overigens ook een full outer join geeft een inner join terug.
Overigens ook een full outer join geeft een inner join terug.
drs. Kama