人に聞けない痔の悩み、これでスッキリ >>

1-a,1-b,2-a,2-b,3-a,3-b,4-a,4-b,5-a,5-bというカラムがあるとき。

以下の条件を満たす行を抽出するのに、
検索速度の早いSQLの書き方はありますか?

(条件)N-aに値有りのとき、N-bは値有り
 ただし、1-aから5-a全て値なしのときは対象外

※こんな書き方は思いつくのですが、遅そうで・・・
(
(1-a is not null AND 1-b is not null) or
(2-a is not null AND 2-b is not null) or
(3-a is not null AND 3-b is not null) or
(4-a is not null AND 4-b is not null) or
(5-a is not null AND 5-b is not null)
) and
not(1-a is null AND 2-a is null AND 3-a is null AND 4-a is null AND 5-a is null)

このQ&Aに関連する最新のQ&A

A 回答 (2件)

>(条件)N-aに値有りのとき、N-bは値有り


> ただし、1-aから5-a全て値なしのときは対象外



>not(
>(1-a is not null AND 1-b is null) or
>(2-a is not null AND 2-b is null) or
>(3-a is not null AND 3-b is null) or
>(4-a is not null AND 4-b is null) or
>(5-a is not null AND 5-b is null) or
>(1-a is null AND 2-a is null AND 3-a is null AND 4-a is null AND 5-a is null)
>)

の2つが、同じ意味とは思えないんですが・・
(説明と違う条件式になっていると思いますよ)

#1で書いたのは・・
>N-aに値有りのとき、N-bは値有り
>ただし、1-aから5-a全て値なしのときは対象外
”N-aが値有り”の場合しか対象としないのだから、”1-aが値なし”の場合というような但し書き条件など無意味であるという話です。
最初の質問にあるSQL文は説明に合致しているとは思いますが、説明の書かれた条件そのものに無駄があると思いますよ。

この回答への補足

ご指摘の通りです。
読み直すと条件の日本語がおかしいです。
条件を見直しました。

(条件)
以下(1)と(3)で構成される行。
ただし、(1)は最低ひとつ必要。
 (1)N-a値有り、N-b値有り
 (2)N-a値有り、N-b値無し
 (3)N-a値無し、N-b値無し
※「N-a値無し、N-b値有り」のパターンは無し

補足日時:2007/06/19 10:37
    • good
    • 0

速いか遅いかは表と索引の状態で変わりますので、何とも言えません。



ただ・・

(
(1-a is not null AND 1-b is not null) or
(2-a is not null AND 2-b is not null) or
(3-a is not null AND 3-b is not null) or
(4-a is not null AND 4-b is not null) or
(5-a is not null AND 5-b is not null)
)

が成りな立つ時は、1-a,2-a,3-a,4-a,5-aいずれかがNOT-NULLの場合であり、必然的に

not(1-a is null AND 2-a is null AND 3-a is null AND 4-a is null AND 5-a is null)

を満たしているはずです。

この回答への補足

すみません。SQLが間違っていました。
notを使うと遅いような気がして・・・

not(
(1-a is not null AND 1-b is null) or
(2-a is not null AND 2-b is null) or
(3-a is not null AND 3-b is null) or
(4-a is not null AND 4-b is null) or
(5-a is not null AND 5-b is null) or
(1-a is null AND 2-a is null AND 3-a is null AND 4-a is null AND 5-a is null)
)

補足日時:2007/06/18 17:35
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング