【SQL】Exists句の考え方と、どのレコードが対象かを確認する方法

以下のような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;