WHERE句の制限の有無について

このQ&Aのポイント
  • WHERE句を使った条件による制限がある場合、極端に時間がかかる可能性があります。
  • 特に注釈の部分を生かすと、処理速度が大幅に低下することがあります。
  • WHERE句の条件を適切に制限することで、処理速度を改善することができます。
回答を見る
  • ベストアンサー

WHERE句の制限の有無について

下記の様なWHERE句を使っていますが、注釈の部分を生かす 極端に時間がかかるようになってしまいます。 (注釈は他の行でも大丈夫です、2~3行殺せば早くなります) なにか制限でもあるのでしょうか? WHERE u.締日コード = @締日コード AND u.入庫日付 <= @終了日付 AND u.部門コード = isnull(@部門コード,u.部門コード) AND u.分類 in ('輸入','輸出') AND u.分類 = isnull(@分類,u.分類) AND u.仕訳コード = isnull(@仕訳コード,u.仕訳コード) AND u.商社 = isnull(@商社,u.商社) --下記を復活すると遅くなる(4秒→38秒) --AND u.保管河岸コード =isnull(@保管河岸コード,u.保管河岸コード) --AND u.品名コード =isnull(@品名コード,u.品名コード) AND ( u.在庫員数 <> 0 or ISNULL(a.当期出庫員数,0) <> 0 or ISNULL(b.出庫員数,0) <> 0 or u.在庫重量 <> 0 or ISNULL(a.当期出庫重量,0) <> 0 or ISNULL(b.出庫重量,0) <> 0 )

  • SEsyo
  • お礼率78% (64/82)

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

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

高速化のアドバイスだけ。 (1) > AND u.保管河岸コード =isnull(@保管河岸コード,u.保管河岸コード) AND (@保管河岸コード IS NULL OR u.保管河岸コード = @保管河岸コード) と書いたほうがよい。 @保管河岸コードがNULLのときは、u.保管河岸コードを参照しなくてすむ。 また、列を右辺に書くとインデックス検索にならない可能性がある。 (2) WHERE 条件1 AND 条件2 AND 条件3 ... のように複数の条件を指定するときは、以下の優先順位で指定する プライマリーキーによる検索 インデックス付の列による検索 絞込みがきつい条件 逆に言うと、WHERE で頻繁に使用する列にインデックスを付ける

SEsyo
質問者

お礼

(1)の方法でこのWhere句は注釈を外しても機能するようになりました。 スピードも一秒以下で動作するようになりました。 制限の有無は解りませんが、機能するようにはなりました。 ありがとうございました。

関連するQ&A

  • accessデータ活用法

    編集方法で悩んでおります。 受注テーブル ID オートNo. 品名 テキスト 数量 数値 品名テーブル ID オートNo. 品名 テキスト とあるとします。 テーブル同士は、リレーションはされておらず、 受注フォームのリストボックスのコントロールソースに品名テーブルが参照されています。 今回、品名を分類コードで仕訳したいのですが... せっかく品名が入力されているのでそれを引用したいです。 そこで、 (1)新たに分類テーブルを作成し組込む (2)品名テーブルの行を増やし、分類コードのフィールド追加 (3)品名を置換えや条件分岐関数で分類コードに変換 ちなみに、品名/分類は10種類以内です。 (1)(2)はいろいろ試しましたが、受注テーブルの既存データのクエリ結果が得られません。 そもそも、考えが間違ってるでしょうか??? 宜しくお願いします。

  • Accessの初心者です。

    Accessの初心者です。 みようみまねでデータベースを作成し、検索フォームを作るところで躓いています。 作成したデータベースは、以下の内容です。 ・書類管理テーブル(*分類番号、日付、書類名、備考) ・分類表テーブル(*分類番号、分類名、保管期間、差出元) ・・・日付は日時/時刻型、その他はすべてテキスト型です。 2つのテーブルを、*分類番号で結合させ、クエリでデータを作成し、[分類番号、分類名、保管期間、差出元、日付、書類名、備考]を表示させています。 このクエリから、(1)差出元、(2)保管期間、(3)日付(期間指定)、(4)書類名(部分一致)をキーとして検索をかけたいのですが、検索の方式を、(1)(必須)and(2)or(3)or(4)(場合によっては(1)and(2)and(3)or(4)のようにもなる)とするには、どうしたらよいのでしょうか。 以下は、失敗の軌跡です。 パラメータークエリの設定で、抽出条件のところに行を変えて条件を入れていっても、複数の条件を入れたときにうまく結果が出せませんでした。 本を見たりして、SQL文で抽出条件を入れてみたりもしたのですが、知識が不足していてうまく動かず・・・。 今度は、検索フォームを作成して上記のクエリを帳票形式で表示させ、ヘッダーの部分に検索のためのコンボボックスとテキスト入力領域を作成して、コマンドボタンで検索をかけるというのを、これまたみようみまねで作ってみたのですが・・・、これもうまく動かず、コードの記述も「??」だらけです。 初歩的なことですみません。 ご教示いただけると助かります。

  • WHERE句について

    numeric, 5(3,0)のフィールドがあり そのフィールドの値が600番台のものを抽出したいのですが どのような方法が一番効率的かご教授ください。 DBはsqlserver2000を使用しています。

  • WHERE句の?

    お世話になります よろしくお願いします。 さっそくで申し訳ないのですが SQL分で SELECT test01 FROM test WHERE test01 = ? の「?」というのはどういう意味があるのでしょうか? 以上よろしくお願いします。

    • ベストアンサー
    • MySQL
  • WHERE句の書き方

    ビューを作る際に、WHERE句に結合条件を指定するのですが、 この条件を書く方法が決まっているのでしょうか。 それとも同じ結果が返ってくるのであれば、何でもいいのでしょうか。 なにか有用なサイトもありましたら含めて教えてください。

  • ACCESS クエリからテーブルへのコピペ

    Pzrivate Sub cmb品番_AfterUpdate() Dim Rst As DAO.Recordset Dim z As String z = DLookup("コード", "Q_コンポーネント", "専用コード='" & Me.tx専用コード & "'") Set Rst = CurrentDb.OpenRecordset("W_部品一覧", dbOpenTable) With Rst .AddNew .Fields("区分") = DLookup("部門", "Q_マスタ", "専用コード='" & z & "'") .Fields("分類1") = DLookup("分類1", "Q_マスタ", "専用コード='" & z & "'") .Fields("分類2") = DLookup("分類2", "Q_マスタ", "専用コード='" & z & "'") .Fields("品番") = DLookup("材料", "Q_マスタ", "専用コード='" & z & "'") .Fields("品名") = DLookup("品名", "Q_マスタ", "専用コード='" & z & "'") .Fields("コード") = DLookup("コード", "Q_マスタ", "専用コード='" & z & "'") .Fields("品種") = DLookup("品種", "Q_マスタ", "専用コード='" & z & "'") .Fields("重量") = DLookup("重量", "Q_マスタ", "専用コード='" & z & "'") .Update End With Rst.Close Set Rst = Nothing End Sub ------------------------------------------------------------ 上記のコードで「Q_マスタ」クエリの内容を「W_部品一覧」テーブルにコピペしています。 ※「W_部品一覧」テーブルはサブフォームです。 「Q_マスタ」クエリの専用コードフィールドには「z」と一致する値が複数あるのですが、上記コードではそのクエリ内の一番上の1レコード分しかコピペできていません。 「z」の値が一致している全てのフィールドを「Q_マスタ」→「W_部品一覧」にコピペするようにしたいです。 For~NextやDo While~Loopを使って処理回数を増やしてみたのですが、同じレコードの内容が繰り返しコピペされてしまいました。 どうすれば複数のレコードをコピペできるかご教示頂けますようお願いします。

  • 列名無効について

    お世話になります。 下記のSQLを実行すると列名無効になってしまいます。 なにが悪いのかまったくわからないので アドバイスをお願いします。 最終行の当月一括仮消売上でエラーになっています。 --当月一括仮消売 select t1.取引先コード, (sum(NVL(ukm.売上検収金額,0))) * -1 AS 当月一括仮消売上 from T_ZZ売上検収 uk, T_ZZ売上検収明細 ukm, (select max(t.取引先コード) as 取引先コード, t.部門番号 from (SELECT b.部門番号 FROM M_ZZ部門 b WHERE not exists(SELECT b.部門番号 FROM M_ZZ部門グループ g,M_ZZ部門グループ明細 gm Where g.部門グループ番号 = gm.部門グループ番号 AND gm.部門番号 = b.部門番号 AND g.部門グループ番号 = 67) AND b.削除フラグ = '0') b, (SELECT t.取引先コード, t.部門番号 FROM M_ZZ取引先 t, M_ZZ部門 b where t.部門番号 = b.部門番号 and b.削除フラグ = '0') t group by t.取引先コード,t.部門番号) t1 where uk.売上検収SEQ = ukm.売上検収SEQ and uk.得意先コード = t1.取引先コード and uk.案件属性 = '0' and uk.元売上検収SEQ IS NULL and uk.承認区分 = '1' and uk.削除フラグ = '0' --開始日付 and uk.検収日 >= to_date('20040401 00:00:00','yyyy/mm/dd hh24:mi:ss') --終了日付 and uk.検収日 <= to_date('20040430 23:59:59','yyyy/mm/dd hh24:mi:ss') --仕入商品販売 and ukm.サービス分類コード != '07' group by t1.取引先コード,当月一括仮消売上 よろしくお願いします。

  • なぜ、WHERE句とHAVING句があるのか?

    なぜ、WHERE句とHAVING句があるのか? SQLを学んでいる時に、疑問に思ったことがあります。 それは、「なぜ、WHERE句とHAVING句があるのか?」ということです。 この2つは、 ・WHERE句 → 表から取り出す行の条件を指定 ・GROUP BY句 → グループ化した結果から取り出す行の条件を指定 という違いがあることは分かっています。 ですが、おなじ「行のかたまりに対する抽出条件」を指定しているのに、 なぜ、わざわざ2つに分ける必要があったのでしょうか? 分けないと不都合が生じるのでしょうか。 もし、明瞭簡潔に説明できる方がいらっしゃいましたら、教えていただけないでしょうか。

  • WHERE句かHAVING句の書き方

    こんにちは id|時間 A|19:00 A|09:00 B|16:00 C|18:00 のようなデータがあって、現在時刻が20:00とします idでグループ化したデータの時間の最大値が、現在時刻の3時間前 (今回は17:00)よりも前または等しいIDだけ抽出するためには どういう条件式を書けば良いか、ヒントを頂けますでしょうか 今回の例でいうと、結果には B|16:00 のみ出てくるということです WHEREやHAVINGを使って試行錯誤してはみたのですが、どうしても 例でいうところの A|09:00とB|16:00 が出てきてしまう始末です (条件にあう方のデータをとってしまい、除外にならない) IF文をうまいこと混ぜればいけるんでしょうか… コードは頑張って自分で作るので、考え方のヒントやこういうのを 使ってみるといいよ、といったアドバイスを頂けると助かります うまく質問の意図が伝わっているか不安ですが、ヨロシクお願いします mysql クライアントのバージョンは5.0.45です

    • ベストアンサー
    • MySQL
  • SQL結合条件

    結合抽出(テーブルの表示)の方法はこのままで WHERE句にあるようなの条件を付け加え 計算も行いたいのですが、よい方法はありませんか? どなたか、ご享受ください。 SELECT MS.商品コード, MS.倉庫コード, MS.現在庫数, ISNULL(SUM(UTP.数量),0)  T売上明細ファイル1OR4, MS.現在庫数 + ISNULL(SUM(UTP.数量),0)  帳簿在庫 FROM T商品別倉庫在庫 MS LEFT JOIN T売上明細ファイル UTP ON MS.倉庫コード = UTP.倉庫コード AND MS.商品コード = UTP.商品コード --WHERE --T売上明細ファイル UTP PLUS条件 -- UTP.売上区分コード = 1 --OR --UTP.売上区分コード = 4 GROUP BY MS.商品コード, MS.倉庫コード, MS.現在庫数