以下のようなSQLがあった場合、条件に合致したレコードが返ってくるが、条件に合わなかったレコードに、どのようなものがあったかを確認したい場合がある。
SELECT
employee_id, first_name, last_name
FROM
employees
WHERE
EXISTS (
SELECT
1
FROM
dependents
WHERE
dependents.employee_id = employees.employee_id
);
上記では、employeeの各レコードに対して、EXISTS句中のサブクエリが実行され、一つでも値が返ってきたらtrueとみなされて、employeeのそのレコードが返される。
そのため、一旦、すべてのレコードをselectし、同時にselect項目でEXISTSを使うと、どのレコードがtrueで、どのレコードがfalseかが分かる。
例えば、以下のようにする。
SELECT
CASE WHEN EXISTS(
SELECT
1
FROM
dependents
WHERE
dependents.employee_id = employees.employee_id
) THEN
1
ELSE
0
END as subq, employee_id, first_name, last_name
FROM
employees;