- ベストアンサー
<ACCESS>別テーブルのレコードのテキストデータが中に含まれるレコードを抽出する方法を教えてください
勉強不測で大変悩んでいます。お分かりになる方教えてください。 A(マスタ_登録済)とB(マスタ_仮登録)という2つのテーブルがあり、それぞれに「アカウント」(テキスト型)というフィールドが存在しています。 Bに存在する全レコードのいづれかの「アカウント」フィールドに入力されている文字列が文字列中に含まれているAのレコードの一覧を出力したいのですが、どうしたらできるでしょうか。 たとえば、 [A] inu inushiba inupo neko nekotama nekoshiro [B] inu nekota とレコードがそれぞれ存在していた場合、 出力したいレコードは inu inushiba inupo nekotama となります。 よろしくお願いいたします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんな方法もできます。 クエリにテーブルAとBを選択、結合しない。 (上記で全結合の状態になります。) テーブルAのみ全表示 テーブルAのアカウントの抽出条件欄に LIKE [B]![アカウント]&"*" もし nekoinu のように中間や後ろも出力の場合は LIKE "*"&[B]![アカウント]&"*"
その他の回答 (5)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>何か、私のテーブルに設定漏れがあるのでしょうか(TT) そんなことないですよ。 #2の方の回答が間違えているだけです。
お礼
そでしたか。。。 教えてくださって有難うございました。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
あ、SQL中のAとBは本当のテーブル名に置き換えてくださいね(^^; select アカウント from マスタ_登録済 where exists (select * from マスタ_仮登録 where マスタ_登録済.アカウント like "*" & マスタ_仮登録.アカウント & "*")
お礼
ご回答ありがとうございました! きちんと出力されていることが確認できました。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
select アカウント from A where exists (select * from B where A.アカウント like "*" & B.アカウント & "*") 多分これでOKかと。相関副問い合わせです。 これをSQLビューに直接書き込んでみてください。
ACCESSでいいんですよね。(どのACCESSでも同じです) 選択クエリーが使えます。 1)テーブルA、テーブルBとも、アカウントのインデックスは「はい (重複なし)」、データ型も「テキスト」にそろえてください。 2)クエリーを作成します。(選択クエリー) AとBを追加して、AのアカウントとBのアカウントを結合してください。 結合プロパティを「Aの全レコードとBの同じ結合フィールドのレコードだけを含める」としてください(結んでいる線をダブルクリックすると設定できます) AのアカウントとBのアカウントをフィールドとして指定します。 Aの並び替えとして、「昇順」を指定します。 Bの抽出条件として、「Is Null」と指定してください。 Bの表示をしたくない場合は、Bの表示のチェックをはずしてください。 このようなクエリーとなります。 SELECT A.アカウント FROM A LEFT JOIN B ON A.アカウント = B.アカウント WHERE (((B.アカウント) Is Null)) ORDER BY A.アカウント; 意味は、 (Aのアカウントを表示します。) (Aの全レコードとBの同じアカウントのレコードだけを含めます。) (BのアカウントがNullのものだけ抽出します) (Aのアカウントを昇順に並び替えます) 3)このクエリーを実行すると、質問のアカウントのみ残ります。 お分かりいただけますでしょうか。
お礼
ご回答ありがとうございました。 ・・・が >SELECT A.アカウント >FROM A LEFT JOIN B ON A.アカウント = B.アカウント >WHERE (((B.アカウント) Is Null)) >ORDER BY A.アカウント; SQLではこのように表示されるのですが、 実行結果にはAのレコード全てが表示されて しまいます。 何か、私のテーブルに設定漏れがあるのでしょうか(TT)
- imogasi
- ベストアンサー率27% (4737/17069)
(1)Aテーブルのフィールド(A)をソートキーとして 昇(降)順でソートします。 (2)Bテーブルのフィールド(B)をソートキーとして 昇(降)順でソートします。勿論昇降順は(1)と(2)で一致させること。 (3)その際注意事項は、(1)と(2)の双方キーフィールドの文字列について、大・小文字、全・半角文字や、途中スペースや表記法(カナなら拗音を大文字か小文字かのようなことほかいろいろ)、前後スペース(TRIMで対策)、左詰め、略号と本名の混合対処などをルールを統一しておく必要があります。 (4)それが完了すると、プログラムではマッチングのアルゴリズムで両者を比較します。この場合(勿論ソート後の)テーブルBを主体にして、レコードの読みを動かします。 Aの第1レコードを読む Bの第1レコードを読む AとBのアカウント・フィールドを比較 Bの文字列文字数分をAの文字列から切りだして(仮にAKとなずける)考える(ここがポイント)。 (AK=B)の場合 含まれている場合で、Bのフィールドを添えてAのフ ィールドを書き出し(または印刷) (AK>B)の場合 Bを読みに行く 上記「AとBのアカウント・フィールドを比較」に行 き以下繰り返し (AK<B)の場合 Aを読みに行く 上記「AとBのアカウント・フィールドを比較」に行 き以下繰り返し Aの終了で処理終了。 だだ困ったことにBのアカウントフィールドの中の前後に 同じ語句が含まれているとこのロジックは混乱する。 例えば猫と猫舌、猫なで声がBのアカウントフィールドに続く場合です。Bの猫のAの検索で猫舌や猫舌研究もリストアップされるのでそれで済むなら、Bの猫舌は処理スキップする手も考えられる。それは困ると言うなら、猫のつくAのフィールドをB猫処理後もワークエリアに蓄え、Bに猫舌が出たとき、蓄えたところを探す。蓄えはBの猫含みキーが去った段階で廃棄する。 前記のようなことが無ければ、RDMSではSQLのCONTAINS句が使えるかもしれない。 また上記は前方一致で考えているが途中一致も考えるとなるとロジックが変ると思う。SQLのCONTAINSや LIKEで考えて見てください。
お礼
早速のご回答ありがとうございます。 こんな手があるのですね。。。 >また上記は前方一致で考えているが途中一致も考えるとな>るとロジックが変ると思う。 前方一致だけで問題なしです。 Bのテーブルに入る単語の制限は半角ということしか かけていないので、 neko neko1 neko2 という形で存在します。 ある人からある名前(neko)でAに登録したいといわれたとき、システム上重複は許さないので、先勝ちでnekoの後に番号を自動または手動で付与して(neko3)という名前で 登録することを了承させるということがしたいのです。。。
お礼
ご回答ありがとうございます。 全結合にすることを忘れてました! 列に対してワイルドカードは使えないのかな と悩んでいましたが・・・・問題はこっちだったんですね(^^;;; ありがとうございました!!