スポンサーサイト 


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--/--/--

Category: スポンサー広告

TB: --  /  CM: --

top △

テーブル間の部分一致結合 


旧記事掲載:2010/08/05

出来上がるクエリは更新できないものになりますが、以下の様な事を考えてみました。

テーブル「TA1」が以下だとします。
anF1
1神奈川県横浜市中区YYY-ZZZ
2東京都港区赤坂YYY
3神奈川県横浜市YYY-ZZZ

テーブル「TB1」が以下だとします。
anF1F2
1中央区0011
2港区0012
3横浜市中区0033
4横浜市南区0034

この時、

F1F2
神奈川県横浜市中区YYY-ZZZ0033
東京都港区赤坂YYY0012

とするクエリの内容は、
SELECT TA1.F1, TB1.F2
FROM TA1 INNER JOIN TB1 ON TA1.F1 Like "*" & TB1.F1 & "*";
になります。

また、一致しなくても「TA1」のものは表示して欲しい場合には、
SELECT TA1.F1, TB1.F2
FROM TA1 LEFT JOIN TB1 ON TA1.F1 Like "*" & TB1.F1 & "*";
となり、結果は以下の様になります。

F1F2
神奈川県横浜市中区YYY-ZZZ0033
東京都港区赤坂YYY0012
神奈川県横浜市YYY-ZZZ 


INNER JOIN / LEFT JOIN を用途によって切り分け、ON で指定する部分を工夫すれば良さそうです。

やってみて動いたので、良しとしますか・・・
以前には直積のものを回答したことがあったかと・・・・


結合の条件としては、[TB1].[F1] で部分一致する [TA1].[F1] のレコードが1つ。

つまり、[TA1].[F1] が "東京都港区・・・・" だった場合、
[TB1].[F1] には、"京都", "港区" が存在してはならない。

[TB1].[F1] に "京都"、[F2] に "1234" を入れて、前者クエリをした結果が以下になります。

F1F2
神奈川県横浜市中区YYY-ZZZ0033
東京都港区赤坂YYY0012
東京都港区赤坂YYY1234

[TA1].[F1] でグルーピングしても、[TB1].[F2] はどっちを???が残るので。。。

同様のものを以前に回答した時には、重複を考慮してませんでした。
追記しようとしたら、閉じられていたので・・・・

う~ん。

抽出って言ったら、どうなんでしょう。
基本は、変更できなくてもOK ???
やはり、それを元に修正していきたい???

ここん所は、確認しないといけないんでしょうね。。。


でも、言ってみた所で、この結果を更新???

できないんで・・・・しょ???



-----

質問への回答は、以下の様な感じでしょうか。(Accessじゃなかったり・・・して)

テーブル「TA1」は、そのまま使うとして、TB1の構成が違うみたいなので、
テーブル「TC1」を以下のように作っておきます。(CSV形式の様・・・ってことなので)
anF1
1中央区,0011
2港区,0012
3横浜市中区,0033
4横浜市南区,0034


標準モジュールに以下関数を作っておきます。
Public Function mySplit(vF As Variant, sDlm As String, iNum As Long) As String
  On Error Resume Next
  If (VarType(vF) <> vbString) Then Exit Function
  mySplit = Split(vF, sDlm)(iNum)
End Function

この記述、前の記事で見ましたね。(MojiCut 関数に似てますね)
どのような情報(引数)を与えるかで、チョコチョコ書き方が変わってきます。
統一すればいいんでしょうけど・・・
今後の課題という事で・・・

そしてクエリに以下を記述します。

SELECT TA1.F1 AS F1, mySplit(TC1.F1,",",1) AS F2
FROM TA1 INNER JOIN TC1 ON TA1.F1 Like "*" & mySplit(TC1.F1,",",0) & "*";
で、結果は以下の様になります。
F1F2
神奈川県横浜市中区YYY-ZZZ0033
東京都港区赤坂YYY0012


※ 遅いと思います(動くけど使い物に??? データ量は??? わかったところで???)

※ 2007 にて


追記してた)

更新できるものを考えてみました。(重複して抽出されるものは除外して)

SELECT TA1.F1, DLookup("mySplit(F1,',',1)","TC1","'" & TA1.F1 & "' Like '*' & mySplit(F1,',',0) & '*'") AS F2
FROM TA1 WHERE TA1.F1 IN (
SELECT TA1.F1 FROM TA1 INNER JOIN TC1 ON TA1.F1 Like "*" & mySplit(TC1.F1,",",0) & "*"
GROUP BY TA1.F1
HAVING Count(*) = 1);

でも・・・・???
関連記事

2011/05/05

Category: クエリ

TB: 0  /  CM: 0

top △

この記事に対するコメント

top △

コメントの投稿

Secret

top △

トラックバック

トラックバックURL
→http://kikutips.blog13.fc2.com/tb.php/67-c48f8fbc
この記事にトラックバックする(FC2ブログユーザー)

top △


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。