Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


138 / 2272 ツリー ←次へ | 前へ→

【12879】テーブルにある単語を含む別テーブルのレコードを素早く削除する方法 かい 15/7/23(木) 12:30 質問[未読]
【12880】Re:テーブルにある単語を含む別テーブルの... かるびの 15/7/23(木) 22:48 回答[未読]
【12881】Re:テーブルにある単語を含む別テーブルの... かい 15/7/24(金) 7:26 お礼[未読]

【12879】テーブルにある単語を含む別テーブルのレ...
質問  かい  - 15/7/23(木) 12:30 -

引用なし
パスワード
   いつもお世話になっております。

テーブルAとテーブルBがあり、
テーブルBからテーブルAに存在する除外条件を含む行を除外して
テーブルCを作成したいと考えています。

テーブル:A

 除外条件
 -----------------
  x1
  x2
  x3

テーブル:B
 FLG
 -----------------
  x1
  x1,x2
  :
  x4
  x4,x5,x6

テーブルBをもとにしたクエリAを作成し、
FLGの抽出条件に下記を指定して作業を行っていたのですが
レコード件数が多すぎるせいか、処理にとても時間がかかってしまいます。
(テーブルAは最大14件、テーブルBは最大3万件くらいあります)

not In (SELECT [テーブルB]![FLG] FROM テーブルA, テーブルB
WHERE [テーブルB]![FLG] Like "*" & [テーブルA]![除外条件] & "*")

この処理を100回程度繰り返すのですが、
もっと早く処理を行う方法はないでしょうか。
お手数をおかけして恐縮ですが、お知恵をお貸しください。

宜しくお願い致します。

【12880】Re:テーブルにある単語を含む別テーブル...
回答  かるびの  - 15/7/23(木) 22:48 -

引用なし
パスワード
    最もオーソドックスな対策は、Bテーブルを正規化するということですね。

 現状においてFLGフィールドの値が「x4,x5,x6」となっているのが,
正規化されていないことの典型です。
 この形は、テーブルの正規化における第1正規形に反しています。
 これを、3レコードに分け、FLGフィールドの値がそれぞれ「x4」「x5」「x6」となるように
テーブルを作り直すべきです。

 テーブルの正規化がどんなものなのかは、いろいろなサイトがあるので、
それらで研究してみてください。

 
 なお、テーブルを変更すると、クエリ、フォーム、レポートなどをほぼ全面的に
作り直さなければならなくなります。
 しかし、間違ったテーブルを作ってしまった報いです。仕方ありません。
 最初からテーブルの正規化を意識しておけば、こうした全面的作り直しを避けられます。

 
 処理に時間がかかっている要因の一つは、
サブクエリにおけるWHERE句でLike演算子を使っていることですが、
Bテーブルを正規化すれば、この要因をクリアできます。


 もう一つの要因は、抽出条件の冒頭にあるIn演算子です。

 SQLを速くするための方策として、一般に、「In演算子は使うな。Exists演算子を使え」
ということが言われています。
 なので、この抽出条件をExists演算子を使った形に直せば、スピードアップが期待できます。

 では、どのように直すかですが、
私は、Exists演算子が苦手で、
いくつかの解説サイトの説明を読んでみても、
In演算子を使ったSQL文を、どうやったらExists演算子を使ったSQL文に直せるのか、
未だに理解できていません。
 そのため、Exists演算子を使う方法があるということを指摘することまでしかできません。

【12881】Re:テーブルにある単語を含む別テーブル...
お礼  かい  - 15/7/24(金) 7:26 -

引用なし
パスワード
   かるびのさん

早々にご回答いただきありがとうございます。

>現状においてFLGフィールドの値が「x4,x5,x6」となっているのが,
>正規化されていないことの典型です。
>この形は、テーブルの正規化における第1正規形に反しています。
>これを、3レコードに分け、FLGフィールドの値がそれぞれ「x4」「x5」「x6」となるように
>テーブルを作り直すべきです。

なるほど。そうなのですね。。。
試してみます。

ありがとうございました。

138 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078188
(SS)C-BOARD v3.8 is Free