質問: 下記の状況で最適なSQLを作成したいのです。 【情報】 テーブル1 カラム名:項目X テーブル2 カラム名:項目Y(※レコード内容は項目Xに文字列を付与したものが入っています) 手順1.ある条件を元にして、テーブル1の項目XのSELECTします。(結果は複数行返ってきます) 手順2.手順1のSELECT結果をWHERE条件にLIKE演算子の前方一致でテーブル2の項目YをSELECTします。 最終的には、手順2で前方一致でぶつからなかった項目Xの値を知りたいと思っています。 これをSQLにて効率的に実行するには、どのようなやり方が望ましいのでしょうか。 テーブル1とテーブル2を結合する際の条件にLIKE演算子を用いるとかですかね、、、?
回答: こんにちは。 ``` SELECT テーブル1.X FROM テーブル1 LEFT JOIN テーブル2 ON テーブル2.Y LIKE テーブル1.X + '%' (AND / OR テーブル2でさらに絞りたい条件式) WHERE テーブル2.Y IS NULL AND ``` 手順1.と2.に「SELECTします」とありますが、これらの値自体はWHERE句の条件に使用したいとの意味であって、その値自体を最終的に欲しているのではないのですよね。 まず先頭のSELECT...で、最終的に欲しい列(最終的には...のところ)を指定します。 LEFT JOIN で「消したい条件(ぶつかった項目)の行」で外部結合させます。 最後に LEFT JOIN でくっついた(ぶつかった)「消したい条件の行」を "テーブル2.任意の列 IS NULL"(つまり、テーブル2がくっついていないものだけを残す)で消します。さらに消したい/残したい条件があれば、ON ...に AND / OR で条件を追加し、LEFT JOIN させるものを調整します。