以下の条件が真の場合は、NOT INの代わりにNOT EXISTS述部を使用してください。
- NOT IN条件のいずれかの列がnull可能として定義されている。
- 主問合わせから、NOT IN条件のいずれかの列にnullが入っているいずれかの行が常に返される必要がある。
- Subqueryの選択リストで返されるnullによって、主問合わせが行を返すのが妨げられてはならない。
例えば、以下の問合わせについてこれまでのすべての条件が真になる場合は、NOT INではなくNOT EXISTSを使用してください。
SELECT dept, DeptName FROM Department WHERE Dept NOT IN (SELECT Dept FROM Course);
NOT EXISTSを使用したバージョンは次のようになります。
SELECT dept, DeptName FROM Department WHERE NOT EXISTS (SELECT Dept FROM Course WHERE Course.Dept=Department.Dept);
つまり、Course.DeptとDepartment.Deptのいずれかがnull可能であり、DepartmentからDeptのnullの行が返される必要があり、Course.Deptのnullが、Departmentから行が返されるのを妨げてはならないということです。