- PR -

テーブルの連結方法について

1
投稿者投稿内容
せんこ
会議室デビュー日: 2004/04/26
投稿数: 18
投稿日時: 2005-05-10 14:04
こんにちは。

テーブルの連結方法で悩んでいます。
いいアイデアがあれば教えてください。

内容としては、以下のようなマスタがあるとします。

[利用者マスタ]
+--------+----+------+
|項目名 |型 |サイズ|
+========+====+======+
|利用者ID|char|10 |
+--------+----+------+
|所属ID |char|4 |
+--------+----+------+

[拠点マスタ]
+--------+-------+------+
|項目名 |型 |サイズ|
+========+=======+======+
|所属ID |char |4 |
+--------+-------+------+
|拠点名 |varchar|20 |
+--------+-------+------+

この2つのテーブルを連結させて利用者IDごとの拠点名を出したいのですが、
拠点マスタのデータが以下のようになっています。
所属ID,拠点名
AAA*,あああああ
AA**,いいいいい
AB**,ううううう
A***,えええええ
B***,おおおおお

※*というのは任意の文字となっています。

所属IDのあたま数桁で拠点が決定されるのですが、桁が異なっているため
うまく連結させることができません。
こういったケースでうまく連結させる方法は無いでしょうか?

以上、同一のケースで問題解決された方やいいアイデアをお持ちの方は
教えてください。
以上、よろしくお願いいたします。
せんこ
会議室デビュー日: 2004/04/26
投稿数: 18
投稿日時: 2005-05-10 14:18
すいません、環境を書いていませんでした。

OS:Windows 2000 SP3
SQLサーバ:SQL Server 2000 SP3

です。
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2005-05-10 14:27
引用:

この2つのテーブルを連結させて利用者IDごとの拠点名を出したいのですが、
拠点マスタのデータが以下のようになっています。
所属ID,拠点名
AAA*,あああああ
AA**,いいいいい
AB**,ううううう
A***,えええええ
B***,おおおおお

※*というのは任意の文字となっています。

所属IDのあたま数桁で拠点が決定されるのですが、桁が異なっているため
うまく連結させることができません。
こういったケースでうまく連結させる方法は無いでしょうか?



4文字一致、3文字一致、2文字一致、1文字一致……それぞれに関してSQLを作成し、UNION ALLで纏めてはいかがでしょうか?
多分、一致度最大のものを採用する……ということだと思いますので、その場合は各SQLに一致度を吐かせて、一致度でソートして1件目を採用するとかにすれば大丈夫だと思います。
TomScissors
ベテラン
会議室デビュー日: 2003/06/05
投稿数: 79
投稿日時: 2005-05-10 14:31
利用者マスタの所属IDにどのような値が入っているか分からないと回答できません。
拠点マスタは、実際に「*」が入っているのですか?

・拠点マスタ
AAA*,あああああ
AA**,いいいいい

・利用者マスタ
AAAB:「あああああ」としたい
AABC:「いいいいい」としたい

という事でしょうか?
その場合、AAAAは、「あああああ」なのか「いいいいい」なのか?
せんこ
会議室デビュー日: 2004/04/26
投稿数: 18
投稿日時: 2005-05-10 14:51
説明不足で申し訳ございません。

TomScissorsさんのかかれている通りなのですが、利用者マスタは既存で
拠点マスタは新規で追加します。
桁をあわせるために*を入れていますが、新規に作成したテーブルということで
中身は変更することができます。

また、利用者マスタの所属IDには
AAA1
AA11
AB11
A111
B111

といった内容が入っています。
所属IDがAAA1の場合は「あああああ」という拠点になります。
所属IDがAA11の場合は「いいいいい」という拠点になります。
たまき
会議室デビュー日: 2005/02/17
投稿数: 10
投稿日時: 2005-05-10 15:29
こんにちは。

せんさんもおわかりかと思いますが大変面倒です;
私としては完全一致で拠点がわかるようにすることをお勧めします。
永井和彦さんやTomScissorsさんがおっしゃっられている通り、AAAAはA***にも、AA**とも合致してしまう事になり、さらに判定が必要となってしまいます。
AAAAなら「あああ」AAABなら「いいい」、といった風にされては如何でしょうか?
その方がSQLの処理も格段に早いかと思います。
4桁中3桁を判定に使用、といったことでしたら、SUBSTRが有効です。
ただ所属IDは拠点マスタの外部参照キーとしてしてのみ使用するのでしたら全桁使用で問題ないと思うのですが。
(※1桁目:国、2桁目:地方、3桁目:県、4桁目:市町村といったようなテーブル設計だったら使いますね)

どうしても必要な設計という事でしたら、参考にならない意見を書き込んでしまい、大変申し訳ありません。


編集:(※)付け足しました。
_________________
ファナ→天@うしゃのメイド
うちゃぎU・×・Uラヴv

[ メッセージ編集済み 編集者: 天 編集日時 2005-05-10 15:43 ]
Beatle
ぬし
会議室デビュー日: 2003/06/09
投稿数: 394
投稿日時: 2005-05-10 16:12
SQLでいろいろするよりも、拠点マスタというテーブルを正規化しちゃい
ましょうよ。規則があるので、データ作るのも簡単でしょうから。

拠点マスタ
AAA1,001
AAA2,001
AA11,002
AB01,003
AB02,003
A111,004
B222,005

拠点名マスタ
001,あああああ
002,いいいいい
003,ううううう
004,えええええ
005,おおおおお

現状の拠点マスタというのは、別の処理でも使うのであれば
Viewとして存続させてもいいでしょう。そうすればアプリの変更も
最小限でしょうし。
せんこ
会議室デビュー日: 2004/04/26
投稿数: 18
投稿日時: 2005-05-11 09:51
永井和彦様、TomScissors様、天様、Beatle様 ご返答ありがとうございました。

Beatle様のご意見を参考にしたいと思います。

今回の件は、ユーザ企業様のデータでオリジナルとは形式を変えて本文を書いて
いたのですが、利用者マスタは約40,000件、所属IDはあたま1桁目は0〜9と英字
2種類があり、他の3桁は数字となっております。
調べたところ所属IDのパターンは140種類ほどありました。
ただ所属IDはユーザ企業様にて決めることで、こちらでは把握できません。
現在の状態から推測すると拠点マスタが12,000件となってしまいますが、それでも
複雑なクエリを書くよりはメンテナンスもやりやすそうなのでそのようにしたいと
思います。
1

スキルアップ/キャリアアップ(JOB@IT)