SQL文だけで可能な処理でしょうか?

このQ&Aのポイント
  • 初心者の私がVB6.0+SQLで困っています。
  • 住所検索フォームでの曖昧検索をSQL文で行いたいです。
  • 6つの項目を検索して結果を表示する処理を実現したいです。
回答を見る
  • ベストアンサー

SQL文だけで可能な処理でしょうか?

今回初めて投稿いたします。 質問内容で、失礼等ございましたら、お伝え下さい。 過去の質問も検索したのですが、それらしいものが見つけられませんでした。 もし、過去に同様の内容がございましたら、お教えください。 さて、質問内容ですが、 当方Accessを少々かじったことがある初心者です。 今回、VB6.0+SQLに挑戦していまして、SQL文で往生しています・・・ 下記のないようをSQL文(又は、ストアド)を記述したいのですが、可能でしょうか? それとも、ワークテーブル等を作成しなければ無理処理なのでしょうか? T郵便番号(テーブル)   郵便番号   都道府県_漢字   市区町村_漢字   町域名   都道府県_カナ   市区町村_カナ   町域名_カナ T事業所郵便番号(テーブル)   郵便番号(個別番号)   事業所名_漢字   事業所名_カナ   都道府県_漢字   市区町村_漢字   町域名 住所検索(フォーム)   mySearch(検索キー) 住所検索.検索一覧(MSFlexGrid)   郵便番号   漢字    カナ 住所検索フォームのmySearchにキーを入力したときに T郵便番号の曖昧検索 郵便番号 漢字(都道府県_漢字 + 市区町村_漢字 + 町域名)  カナ(都道府県_カナ + 市区町村_カナ + 町域名_カナ) T事業所郵便番号の曖昧検索 郵便番号 漢字(事業所名_漢字)  カナ(事業所名_カナ) 6つの項目を検索して、住所検索.検索一覧(MSFlexGrid)の3項目に表示する。 取り留めない文章になりましたが、SQL文だけで可能な処理でしょうか? よろしく、お願い致します。 尚、テーブルのデータは、郵政省の郵便番号データを利用していまして、一部省略してあります。

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

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

えーと。。。前回の回答をヒントにできないでしょうか? - -; こんな感じでしょうか? SELECT * FROM (SELECT  郵便番号  ,都道府県_漢字 + 市区町村_漢字 + 町域名 AS 漢字  ,都道府県_カナ + 市区町村_カナ + 町域名_カナ AS カナ FROM  T郵便番号 UNION SELECT  郵便番号(個別番号) AS 郵便番号  ,事業所名_漢字 AS 漢字  ,事業所名_カナ AS カナ FROM  T事業所郵便番号) work WHERE  (郵便番号 LIKE '%(検索key?)%' OR 漢字 LIKE '%(検索key?)%') でどうでしょう? (今回のは走らせていないのでtypoがあるかもしれません。)

h_hirocchi
質問者

お礼

mjsamiasanさん、返事が遅くなってすみませんでした。 度々の回答ありがとうございます。 返事を書いたあと、前回の回答を参考に時間が掛かりすぎて・・ SQL文よりストアドの方が早いって聞いたので、ちょっと手こずってしまいました。^^; 一応、ストアド文を書いておきます。 CREATE PROCEDURE spMX_S01 ( @inMX03 sysname = null ) AS set nocount on --******************* select 郵便番号 = Left(新番号,3) + '-' + Right(新番号,4) ,漢字 = 都道府県_漢字 + 市区_漢字 + 町村_漢字 ,カナ = 都道府県_カナ + 市区_カナ + 町村_カナ ,住所 = " " from T郵便番号マスタ with (index(IX_T郵便番号マスタ)) where (@inMX03 is null or 新番号 like '%' + @inMX03 + '%' or (都道府県_漢字 + 市区_漢字 + 町村_漢字 like '%' + @inMX03 + '%')) union select 郵便番号 =Left(新番号,3) + '-' + Right(新番号,4) ,漢字 = 事業所名_漢字 ,カナ = 事業所名_カナ ,住所 = 都道府県_漢字 + 市区町村_漢字 + 町域名 + 丁目番地 from T郵便番号事業所マスタ with (index(IX_T郵便番号事業所マスタ)) where (@inMX03 is null or 新番号 like '%' + @inMX03 + '%' or 事業所名_漢字 like '%' + @inMX03 + '%' or (都道府県_漢字 + 市区町村_漢字 + 町域名 + 丁目番地 like '%' + @inMX03 + '%')) order by 郵便番号 一部列名を変更していますが、教えていただいた内容と同じだと思います。 一つ気になる点は、検索="三協"だと、「・・・三・・・・・協・・・」も検索してくるのですが・・・ 指摘がありましたらよろしくお願いいたします。

その他の回答 (1)

回答No.1

こんな感じでしょうか? SELECT  郵便番号  ,都道府県_漢字 + 市区町村_漢字 + 町域名 AS 漢字  ,都道府県_カナ + 市区町村_カナ + 町域名_カナ AS カナ FROM  T郵便番号 WHERE  郵便番号 LIKE '%(検索key?)%' UNION SELECT  郵便番号(個別番号) AS 郵便番号  ,事業所名_漢字 AS 漢字  ,事業所名_カナ AS カナ FROM  T事業所郵便番号 WHERE  郵便番号(個別番号) LIKE '%(検索key?)%' 曖昧検索部は工夫する余地ありですが--;

h_hirocchi
質問者

お礼

mjsamiasanさん、迅速な回答をありがとうございます。 私の説明が下手だったみたいで申し訳ありません。 検索キーは、郵便番号だけではなくて、文字列の検索もしたいのです。 例えば、 例1 "東京" と入力すると T郵便番号とT事業所郵便番号の下記が検索対象で、 郵便番号 漢字 = 都道府県_漢字 + 市区町村_漢字 + 町域名 カナ = 都道府県_カナ + 市区町村_カナ + 町域名_カナ 結果、T郵便番号の漢字の中で"東京"を含むもの と T事業所郵便番号の漢字の中で"東京"を含まれるものが検索される。 例2 "340" と入力すると T郵便番号とT事業所郵便番号の下記が検索対象で、 郵便番号 漢字 = 都道府県_漢字 + 市区町村_漢字 + 町域名 カナ = 都道府県_カナ + 市区町村_カナ + 町域名_カナ 結果、T郵便番号の郵便番号と漢字の中で"340"を含むもの と T事業所郵便番号の郵便番号と漢字の中で"340"を含まれるものが検索される。 ようにしたいのですが、SQL文で可能でしょうか? 検索のヒントは、下記サイトの郵香というソフトです。 http://www.yu-bin.net/

関連するQ&A

  • Accessで住所分割 並び順で問題?

    Accessで住所を4項目(都道府県・市区町村・町域・その他)に 分割しようとしていますが、市区町村の分割がうまくいきません。 並び順に問題がある気がしているのですが ご教授いただけると助かります。 ■マスタ登録状況■■■■■■■■■■■■■■■■■■■ ※日本郵政HPから郵便番号一覧をダウンロードし以下を用意 ○都道府県一覧 都道府県 --------- 東京都 神奈川県 ○市区町村一覧 ※市区町村が(以下にない場合)などのデータは削除済 都道府県 市区町村 ----------------------- 神奈川県 横浜市金沢区 神奈川県 横浜市 ○市区町村一覧 ※町域が(以下にない場合)などのデータは削除済 都道府県 市区町村   町域 ---------------------------------------- 神奈川県 横浜市金沢区 福浦 神奈川県 横浜市金沢区 平潟町 神奈川県 横浜市    中区新山下 ■処理フロー■■■■■■■■■■■■■■■■■■■ 【実行前】住所一覧 ワーク          都道府県 市区町村 町域 ---------------------------------------------------- 神奈川県横浜市金沢区福浦*-*-* (1)都道府県分割クエリ実行 ・都道府県をセット ・ワークから都道府県を削除 【クエリ(1)後】住所一覧 ワーク          都道府県 市区町村 町域 ---------------------------------------------------- 横浜市金沢区福浦*-*-*   神奈川県 (2)市区町村分割クエリ実行 ・市区町村をセット ・ワークから市区町村を削除 【クエリ(2)後】住所一覧 ワーク          都道府県 市区町村 町域 ---------------------------------------------------- 福浦*-*-*         神奈川県 横浜市金沢区 (3)町域分割クエリ実行 ・町域をセット ・ワークから町域を削除 【クエリ(3)後】住所一覧 ワーク          都道府県 市区町村 町域 ---------------------------------------------------- *-*-*         神奈川県 横浜市金沢区 福浦 !!!!!クエリ(2)市区町村分割で困っています!!!!! ■クエリ実行結果■■■■■■■■■■■■■■■■■■■ 欲しい結果↓ ワーク          都道府県 市区町村 町域 ---------------------------------------------------- 福浦*-*-*         神奈川県 横浜市金沢区 現状↓ ワーク          都道府県 市区町村 町域 ---------------------------------------------------- 金沢区福浦*-*-*         神奈川県 横浜市 ■クエリSQL■■■■■■■■■■■■■■■■■■■ クエリ(2)市区町村分割(1) ※市区町村をセット UPDATE 住所一覧, 市区町村一覧 SET 住所一覧.市区町村 = 市区町村一覧.市区町村名 WHERE (((住所一覧.ワーク) Like 市区町村一覧.市区町村 & "*") AND ((住所一覧.都道府県)=市区町村一覧.都道府県名)); クエリ(2)市区町村分割(2) ※ワークから市区町村を削除 UPDATE 住所一覧 SET 住所一覧.ワーク = Replace(住所一覧.ワーク,住所一覧.市区町村,"") WHERE (((住所一覧.市区町村) Is Not Null)); 市区町村一覧の並び順を降順にしたり、 間に選択クエリをはさんでLen(市区町村)で降順にしたり、 「横浜市金沢区」が「横浜市」より先に来るようにしていますが うまくいきません。 長文ですがどうぞよろしくお願い致します。

  • 町域って?

    大変非常識な質問で申し訳ありません。 ○○市△△1番地1号 ××マンション111号 に住んでいるとします。 いつもよくわからないのですが、 町域・番地の欄って△△も含みますか?? 町域・番地の例には「3-3-3」としか書いてありません。 しかし、郵便番号・都道府県、市区町村郡、町域・番地、建物名を記入する場合、 市区町村郡→○○市 建物名→××マンション111号 となりますよね? そもそも町域・番地に数字しか並ばない場合ってあるのでしょうか?

  • テーブルの分散について

    お世話になります。 個人情報を格納しているユーザーテーブルがあります。 項目は以下の通りです。 ------------------------------ 1.連番 2.ユーザーID 3.名前カナ(姓) 4.名前カナ(名) 5.名前(姓) 6.名前(名) 7.性別 8.生年月日 9.年齢 10.電話番号 11.携帯番号 12.メールアドレス 13.パスワード 14.職業 15.郵便番号 16.国 17.住所(都道府県) 18.住所(市区町村) 19.住所(町域(番地)) 20.住所(建物名) 21.備考1 22.備考2 23.備考3 24.備考4 25.備考5 ------------------------------ 上記のように個人情報を1つのテーブルにまとめてセキュリティ上、問題はありませんでしょうか。 もし上記のテーブルを分散するとしたらどのように管理するようにしたらいいのでしょうか。 くだらない質問で大変申し訳ありませんがご教授いただけたら幸いです。 何卒、アドバイスの方を宜しくお願いします。

  • SQL文を教えてください。

    受付テーブルと顧客テーブルがあります。 受付テーブル(受付日、顧客No、受付時間、受付内容) 顧客テーブル(顧客No、顧客名カナ、顧客名、顧客住所) 上記のテーブルがあるとします。 やりたい事は顧客Noを結合し 最新の受付日、前回受付日、前々回受付日を新しい受付日の順番に顧客毎に抽出したいのです。 仮に前回受付日と前々回受付日の内容が無ければNULL値を返します。 抽出したいフィールドは受付日、前回受付日、前々回受付日、顧客No、顧客名カナ、顧客名、顧客住所、受付内容です。 どんな構文になるのでしょうか? どのようなSQLになるでしょうか? うまく伝わっているでしょうか? よろしくお願いします。

  • SQL (insert文)文の質問です。

    すみません、緊急で調べる時間があまりなくてお尋ねします。 次のDBが2つあります。 データベース名:A_DATA 内容  名前     番号     登録年月日 これには既にデータが投入されています。 そして データベース名:B_DATA 内容  名前     番号     住所     電話     国籍 とあった場合B_DATAにinsertを行うのですが、 その際のデータの内容はA_DATAの内容を検索してその 値を投入したいのです。 A_DATAの検索条件は登録年月日が本日のもので B_DATAの名前と番号の値は 名前=A_DATAの名前 番号=A_DATAの番号 でINSERTしたいのです。 意味がわかりますでしょうか? 多量にデータがあるのでなんとかうまいSQLを考えてるのですが、あまり詳しくないもので。。。 すみません誰かよろしくお願いします。

  • 【Access】住所を分割して抽出したい

    Accessで住所から都道府県と市区町村を抽出 はじめまして、Access初心者です。 右も左もわかっていないので 質問がおかしかったら申し訳ございません。 Accessのクエリを使って 住所録テーブルのデータにある住所から 都道府県、市区町村、それ以降 で分けて表示したいと思っています。 元のデータは、都道府県名が入っていないものや、都道府県名から始まっていない物、そもそも入力されていないものもあります。 都道府県一覧のテーブル(テーブル名: T_都道府県)と 市区町村一覧のテーブル(テーブル名: T_市区町村) は準備しました。 色々調べたのですが、Access不慣れな為 正しい式が書けておりません。 現在はサブクエリに 都道府県:(select[都道府県名] from T_都道府県 where [住所] like [都道府県名]&"*") 市区町村:(select[市区町村名] from T_市区町村 where [住所] like "*"& [市区町村名]&"*") それ以降:Replace (Nz([住所]," "),Nz([都道府県]," "),Nz([市区町村]," ")," ") と入力して実行したら このサブクエリでは1つのレコードしか返せません。 のエラーが出てしまいました。 (ですよね、、、) 都道府県と市区町村のテーブルを利用して どう直せば、うまく表示ができるのか わかる方教えていただけると幸いです。 どうか、よろしくお願いいたします。

  • テーブル設計につきまして(正規化)

    顧客情報管理サイトを作ろうと思っています。 ・非正規化  {顧客コード , 氏名 , かな名 , 性別 , 郵便番号 , 都道府県 , 市区町村 , 建物名 , 電話番号 ,  FAX番号 , 携帯番号1, 携帯メール1 , 携帯番号2 , 携帯メール2 , 顧客ランク,備考}  の列を考えております。 ・正規化テーブル  1.顧客情報テーブル   {顧客コード , 氏名 , かな名 , 性別 ,郵便番号(外部キー) , 建物名 , 電話番号 ,   FAX番号 , 携帯番号1, 携帯メール1 , 携帯番号2 , 携帯メール2 , 顧客ランク,備考}  2.郵便情報   {郵便番号(主キー) , 都道府県 , 市区町村 これ以上、正規化できないと思っているのですが、顧客情報テーブルをもっと効率よく テーブルを設計し、正規化できるものでしょうか? よろしくお願いします。

  • 住所の分割方法

    顧客データで、住所フィールドが1,2,3とあり、本来であれば、 1・・・都道府県 2・・・市区町村から番地 3・・・マンション、アパート名 としなければいけないのですが、郵便番号辞典から入力したため、住所2のフィールドに1と2がくっついて入力されています。 これを都道府県で切って、都道府県名を住所1のフィールドに、市区町村から番地までを住所2のフィールドに分割したいのですが、関数もしくはマクロがあれば教えてください。 住所1には、「東京都」などの「都」に相当する都道府県名まで入れたいのですが。 (データが5000件くらいあります)

  • SQLを使って他のテーブルから更新したいのですが

    状況説明 テーブル:顧客→マスターファイルで住所や電話がブランク テーブル:NewTable→住所や電話番号でデータを持っている NewTableの内容を顧客テーブルに更新したい SQL→ UPDATE 顧客 INNER JOIN NewTable ON 顧客.店舗名 = NewTable.店舗名 SET 顧客.客室数 = NewTable.客室数, 顧客.郵便番号 = NewTable.郵便番号, 顧客.都道府県 = NewTable.住所, 顧客.店電話 = NewTable.電話番号, 顧客.店FAX = NewTable.FAX NO, 顧客.オープン日 = NewTable.オープン日; 実行方法→ これが正しいかどうか分からないのですが、 モジュールのオブジェクトを選んで 新規作成を選ぶとVBモードになります。 ここでイミディエイト画面を出して 上記のSQLをそのまま入れ、 実行のため、Enterキーをたたいたら エラーが発生→ コンパイラエラー 修正候補:ステートメントの最後 と出ました。 質問→ そもそもSQLの実行をイミディエイト画面からでいいのかも わかりません 何かアドバイスいただけますでしょうか

  • SQL文の副問い合わせについて

    SQLの勉強をし始めて間もありませんが、以下のSQLについて教えてください。 実はこの問題は昭晃堂発行の北川博之先生が書いた「データベースシステム」という本に乗っている問題です。以下のようなデータベースがあります。 部門(_部門番号,部門名) 部品(_部品番号,部品名) 業者(_業者番号,業者名,住所,電話番号) 従業員(_従業員番号,従業員名,氏名,住所,年齢) 供給(_部門番号,_部品番号,_業者番号,単価,数量) _がついているのは主キー この中で、登録されているすべての部品の供給を受けている部門の部門番号を表示するSQLを記せという問題があります。 つまり、部品表の供給テーブルの中の部門番号ごとに、供給テーブルのなかに含まれる部品番号と部品テーブルの部品番号がすべて一致するかを調べるSQLを書かなければならないということです。 まったく歯が立たないので、いろいろと調べた結果、 SELECT DISTINCT 部門番号 FROM 供給 AS 供給1 WHERE NOT EXISTS( SELECT * FROM 部品 WHERE NOT EXISTS( SELECT * FROM 供給 AS 供給2 WHERE 部品.部品番号=供給2.部品番号 AND 供給1.部門番号=供給2.部門番号 )); が正解であるということでした。 しかし、NOT EXISTSが2回も出てくるばかりか、副問い合わせの連続で頭が混乱してよく理解できません。 このSQL文について、具体的にはどのようなことをやっているのでしょうか?教えてください。お願いします。