• ベストアンサー

結合したテーブルの検索条件について。

分からないことが出てきたので、すみませんが、教えてください。 次のような2つのテーブルを仮定します。 テーブルa  テーブルb no, title   no, aNo, delFlag  1, あえ    1, 1,  ,0 2, ああ    2, 3,  ,0 3, いう    3, 4,  ,1 4, あいあ ここで、titleに「あ」を含み、delFlagで「1」が立っていないものを検索したいのです(テーブルaのnoで、1,2を検出したい)が、 SELECT a.no AS no FROM a LEFT JOIN b ON a.no=b.aNo WHERE a.title LIKE '%あ%' and b.delFlag != 1 だと、テーブルaのno.2が検出できません。 このようなケースで、テーブルaのno1,2を選び出すことができる方法はないでしょうか? 以上、分かりにくい説明ですが、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>titleに「あ」を含み、delFlagで「1」が立っていないものを検索したい 「delFlag!=1」では、ナル値のデータは検索できません。 検索条件を、以下のように変えてみてください。 【検索条件】 WHERE a.title LIKE '%あ%' and (b.delFlag != 1 or b.delFlag is null); 【追記】 LIKEの中間一致やnot条件の検索では、性能は出せませんよ?

xyz_1990
質問者

お礼

ありがとうございます!! 解決しました。 >LIKEの中間一致やnot条件の検索では、性能は出せませんよ? とは、どういう意味でしょうか? よろしければ、ご教授いただけないでしょうか?

その他の回答 (2)

回答No.3

#2回答者です。 「c1 like 'abc%'」といった検索条件なら、インデクスがあれば範囲検索と同じで有効利用されます。 しかし、「c1 like '%abc%'」といった検索条件の場合、インデクスがあってもすべてのインデクスの情報(正確には、B-TREE構造の最下段=リーフ)を見なければならなくなります。 「c1!=1」という条件も、RDBMS側には何種類のデータ値があるか分からないので、インデクスがあってもすべてのインデクス情報を見なければなりません。「c1=0」とした方が、絞り込んだアクセスが可能です。

xyz_1990
質問者

お礼

ご回答ありがとうございます。 ちょっと、私には高度なようです。 今後、じっくり勉強していきたいと思います。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

nullは評価の対象外なのでb.delFlag != 1をおこなっても null値は拾えないようです。 どうしてもというのであれば SELECT * FROM テーブルa AS a LEFT JOIN テーブルb AS b ON a.no=b.aNo WHERE a.title LIKE '%あ%' AND (b.delFlag !=1 OR b.delFlag IS NULL)

xyz_1990
質問者

お礼

ありがとうございます!! 解決しました。

関連するQ&A