MySQLにてサブクエリをWHEREに使用した検索を行います。
SELECT *
FROM tableA
WHERE (SELECT tableB.[検索カラム] FROM tableB WHERE tableB.id = tableA.id) = [検索値]
このとき、tableAが別名(エイリアス)になっていた場合は検索が可能でしょうか?
SELECT *
FROM tableA AS aliasA
WHERE (SELECT tableB.[検索カラム] FROM tableB WHERE tableB.id = aliasA.id) = [検索値]
答えは、可能です。
ただし実際にこのような構造のサブクエリを使う場合、だいたいは親(tableA)に紐づく子(tableB)を集計した値を検索したい、みたいな需要になります。
SELECT *
FROM tableA
INNER JOIN tableB ON tableA.id = tableB.id
WHERE (SELECT SUM(tableB.[検索カラム]) FROM tableB WHERE tableB.id = tableA.id GROUP BY tableB.id) = [検索値]
このとき、親クエリのtableA・tableBを別名にする場合、サブクエリはどうなるでしょうか?
SELECT *
FROM tableA AS aliasA
INNER JOIN tableB AS aliasB ON aliasA.id = aliasB.id
WHERE (SELECT SUM(tableB.[検索カラム]) FROM tableB WHERE tableB.id = aliasA.id GROUP BY tableB.id) = [検索値]
WHERE句で連結する親テーブルは、別名で指定する必要があります。
一方で別途集計するサブクエリのFROM句には、正規のテーブル名を指定しなければなりません。
※サブクエリのFROMで別途別名を付け、サブクエリ中で運用するのはOK
複雑なSQLでうっかりtableA・tableBの扱いを逆にしてしまい、エラーを食らったので備忘録でした。