作成: 更新:

【SQL嫌い】UNION句節インラインビューにすると辛い【独り愚痴】

sqlmysqlunionunionallインラインビューサブクエリ副問合せ

結論

問題切り分けて細かくして確認することが重要

実例

以下のSQLをみた時、エラーになるんですけど、何がダメだと思います?

SELECT
    member.id
FROM
    team
LEFT JOIN (
    SELECT
        team.member_id,
        team.member_manager_id
    FROM
        team
        LEFT JOIN client ON client.id = team.member_id
    WHERE
        team.member_id IS NOT NULL
    UNION ALL
    SELECT
        team.next_member_id,
        team.next_member_manager_id
    FROM
        team
        LEFT JOIN client ON client.id = team.next_member_id
    WHERE
        team.next_member_id IS NOT NULL
) AS member ON member.id = team.member_id

パッとわかる人は
SQL得意なんですね。。。
僕嫌いです。。。

正解は
member.id
なんて存在しません!でした!

これ、言われたらすぐわかるんですけど
サブクエリやインラインビュー3階層くらいになってくると
まじで分からなくなる。。。
(1時間これにかかったとは言えない)

  • サブクエリやインラインビューがネストしてる時は
    必ず一番深いネストから順番にSQL回して確認してく!
  • UNIONがサブクエリやインラインビューの場合は
    外側の値を使ってないか確認する!
    (外側の値は参照できないよー)

これを着実にやるしかないですね。
もんだい切り分け重要。