電子書籍の厳選無料作品が豊富!

以下の様な2つのテーブルが有った場合、[商品テーブルA]と[商品テーブルB]
の商品名フィールド同士の商品名が部分一致した場合、
[商品テーブルB]のIDフィールドに[商品テーブルA]のIDフィールドのID番号を
付与したいと考えております。

この様な場合のSQL文を教えて頂けませんでしょうか。

[商品テーブルA]
ID  商品名
-------------
1  A1AAAA
2  A1AAAB
3  A1AABB
4  A1ABBB
5  A1BBBB


[商品テーブルB]
ID  商品名
-------------
   AAAB
   AAAA
   BBBB
   AABB
   ABBB


SQLの結果として[商品テーブルB]が以下の様に更新される結果を期待しています。

【結果】
[商品テーブルB]
ID  商品名
-------------
2  AAAB
1  AAAA
5  BBBB
3  AABB
4  ABBB


商品名が完全一致する場合であれば、update inner join on set を使えば上手くいのですが、
部分一致の場合どの様にすれば良いのか、行き詰っています。

以上、宜しくお願い致します。

A 回答 (11件中1~10件)

No10の



あるいは、関数を使った使用例
のところで、以下のSQL文

SELECT TA.商品名
FROM 商品テーブルA AS TA INNER JOIN 商品テーブルB AS TB ON TA.商品名=funcAAA(TA.商品名,TB.商品名);



SELECT TA.商品名
FROM 商品テーブルA AS TA INNER JOIN 商品テーブルB AS TB ON TA.商品名=funcA(TA.商品名,TB.商品名);

にしてください。関数名のfuncAがfuncAAAになっていました。
    • good
    • 0

一度選択クエリでデータが抽出されるか確認してみてください。



SELECT TA.商品名
FROM 商品テーブルA AS TA INNER JOIN 商品テーブルB AS TB ON TA.商品名 LIKE "*" & TB.商品名 & "*";


あるいは、関数を使った使用例
SELECT TA.商品名
FROM 商品テーブルA AS TA INNER JOIN 商品テーブルB AS TB ON TA.商品名=funcAAA(TA.商品名,TB.商品名);


選択クエリで抽出できれば追加クエリでテーブルに追加可能な
データであることは確認できます。あとは追加先のテーブルの
フィールドの型とか。
あるいは、追加先テーブルと基テーブルの名前を入れ間違えている
といことは・・・・?
    • good
    • 0

No8のSQL


フィールド名を置き換える時の注意点として

[]←カギ括弧は、全て残したままにしてください

[商品テーブルA]→商品テーブル本番 はNG
[商品テーブルA]→[商品テーブル本番] はOK
    • good
    • 0

No.1です。



UPDATE [商品テーブルB] INNER JOIN [商品テーブルA] ON [商品テーブルA].[商品名] Like "*" & [商品テーブルB].[商品名] SET [商品テーブルB].[ID] = [商品テーブルA].[ID];

今一度、上記SQLをコピペし、
商品名テーブル等をご使用のフィールド名に置き換えて実行してみてください。

その際、反応が返ってこないというのが分かりづらいのですが、
エラー等のメッセージ何も無く、
商品テーブルBも何も更新されていない状況なのでしょうか?
    • good
    • 0

A13AAAA


A1AAAB32
A1PP6AABBAA
A1ABBBABBB
A1BBBB
A5ABBBTABBB


AAAB
AAAA
BBBB
AABB
ABAB


実はNo4さんの方法でも抜けてしまう文字列が
あります。たとえば、上記の場合、4番目が
カウントされてしまいます。同じ文字列が
複数ある場合の誤作動ということで言えば、
No3と似かよってはいますが。

(1)後ろからの完全一致
(2)文字列は一回のみ出現
(3)前からはあいまい

ということを満たそうとすれば関数を作る
必要があります。以下の関数です。

以下の関数を標準モジュールに貼り付け保存します。
(コメント付き)


'文字列str1に文字列str2の出現回数が一回であるか求める。
'出現位置が後ろからの位置と同じかを求める。
'上記が一致したらstr1を返す。
'一応テキストモードで比較
Function funcA(ByVal str1 As String, ByVal str2 As String) As String
If InStrRev(str1, str2) = Len(str1) - Len(str2) + 1 Then
If UBound(Split(str1, str2)) = 1 Then
funcA = str1
End If
End If
End Function


この関数を使って以下のようにします。

UPDATE 商品テーブルB INNER JOIN 商品テーブルA ON [商品テーブルA].[商品名]=funcA(商品テーブルA.商品名,商品テーブルB.商品名) SET 商品テーブルB.ID = [商品テーブルA].[ID];

この回答への補足

回答ありがとうございます。
何故だかわかりませんが、皆さんからいただいたSQLを実行すると
一向に結果が帰って来ない状況です・・・。

たかだか1200行にみたない処理なのですが・・・原因不明ですが、私(Access2003)と他の人間(Access2007)の環境でも一緒でした。

補足日時:2011/10/04 01:57
    • good
    • 0

No4のSQL



商品テーブルA on 

を抜かしてしましました。
スイマセン。
    • good
    • 1

A13AAAA


A1AAAB32
A1PP6AABBAA
A5ABBBTTABBB
A5ABBBABBB
A66BBBB66

No4さんのいう誤作動を起こす場合と言うのは、
上記の4番目あるいは5番目の同じ文字列が含まれる場合を
指しているのでしょう。
まあ、そのような場合があるのならば質問された方が
補足されるでしょう。連続した文字列を商品名に
書くようなことはお目にかかったことはないので。
それと、No4で表示されているSQL文が不完全なので、
以下のように。

UPDATE 商品テーブルB INNER JOIN 商品テーブルA ON [商品テーブルA].[商品名] Like "*" & [商品テーブルB].[商品名] & "" SET 商品テーブルB.ID = [商品テーブルA].[ID];

この回答への補足

回答ありがとうございます。
何故だかわかりませんが、皆さんからいただいたSQLを実行すると
一向に結果が帰って来ない状況です・・・。

たかだか1200行にみたない処理なのですが・・・原因不明ですが、私(Access2003)と他の人間(Access2007)の環境でも一緒でした。

補足日時:2011/10/04 01:57
    • good
    • 0

No.1です。


No.3の方の回答でほぼ問題はないとは思います。

多少気になるのとしては、前方後方のあいまい検索なので、
テーブルの商品名表記の仕方によっては誤動作します。
(テーブルの内容によっては、No.3様のご回答通りで問題無いとは思います)

なので、一応、前方あいまい、後方完全一致に修正させて頂いて

update 商品テーブルB inner join 商品テーブルA.商品名 Like "*"&商品テーブルB.商品名 set 商品テーブルB.ID=商品テーブルA.ID

でいいかと思います。

この回答への補足

回答ありがとうございます。
何故だかわかりませんが、皆さんからいただいたSQLを実行すると
一向に結果が帰って来ない状況です・・・。

たかだか1200行にみたない処理なのですが・・・原因不明ですが、私(Access2003)と他の人間(Access2007)の環境でも一緒でした。

補足日時:2011/10/04 01:56
    • good
    • 0

以下ではどうですか?



UPDATE 商品テーブルB INNER JOIN 商品テーブルA ON [商品テーブルA].[商品名] Like "*" & [商品テーブルB].[商品名] & "*" SET 商品テーブルB.ID = [商品テーブルA].[ID];

この回答への補足

回答ありがとうございます。
何故だかわかりませんが、皆さんからいただいたSQLを実行すると
一向に結果が帰って来ない状況です・・・。

たかだか1200行にみたない処理なのですが・・・原因不明ですが、私(Access2003)と他の人間(Access2007)の環境でも一緒でした。

補足日時:2011/10/04 01:56
    • good
    • 0

No.1です。



Aのテーブル更新かと思ったらBなんですね。
読み間違えてました。

一発変換だと、こんなSQLではどうでしょうか?

update 商品テーブルB inner join 商品テーブルA on 商品テーブルB.商品名=Mid(商品テーブルA.商品名,3) set 商品テーブルB.ID=商品テーブルA.ID

この回答への補足

回答有難う御座います。

サンプルのテーブルとデータ内容ですが、対象の文字列を

A1AAAA
A1AABB

の様にしていましたが、商品名の「A1」部分の文字数は定まった
文字数ではなく、それぞれの商品で違うと考えてやって下さい。

説明不足であった点、申し訳有りません。

どうぞ、お力お貸し下さい。

以上、宜しくお願い致します。

補足日時:2011/10/01 13:14
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す