以下の様な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件)
- 最新から表示
- 回答順に表示
No.11
- 回答日時:
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になっていました。
No.10
- 回答日時:
一度選択クエリでデータが抽出されるか確認してみてください。
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.商品名);
選択クエリで抽出できれば追加クエリでテーブルに追加可能な
データであることは確認できます。あとは追加先のテーブルの
フィールドの型とか。
あるいは、追加先テーブルと基テーブルの名前を入れ間違えている
といことは・・・・?
No.9
- 回答日時:
No8のSQL
フィールド名を置き換える時の注意点として
[]←カギ括弧は、全て残したままにしてください
[商品テーブルA]→商品テーブル本番 はNG
[商品テーブルA]→[商品テーブル本番] はOK
No.8
- 回答日時:
No.1です。
UPDATE [商品テーブルB] INNER JOIN [商品テーブルA] ON [商品テーブルA].[商品名] Like "*" & [商品テーブルB].[商品名] SET [商品テーブルB].[ID] = [商品テーブルA].[ID];
今一度、上記SQLをコピペし、
商品名テーブル等をご使用のフィールド名に置き換えて実行してみてください。
その際、反応が返ってこないというのが分かりづらいのですが、
エラー等のメッセージ何も無く、
商品テーブルBも何も更新されていない状況なのでしょうか?
No.7
- 回答日時:
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)の環境でも一緒でした。
No.5
- 回答日時:
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)の環境でも一緒でした。
No.4
- 回答日時:
No.1です。
No.3の方の回答でほぼ問題はないとは思います。
多少気になるのとしては、前方後方のあいまい検索なので、
テーブルの商品名表記の仕方によっては誤動作します。
(テーブルの内容によっては、No.3様のご回答通りで問題無いとは思います)
なので、一応、前方あいまい、後方完全一致に修正させて頂いて
update 商品テーブルB inner join 商品テーブルA.商品名 Like "*"&商品テーブルB.商品名 set 商品テーブルB.ID=商品テーブルA.ID
でいいかと思います。
この回答への補足
回答ありがとうございます。
何故だかわかりませんが、皆さんからいただいたSQLを実行すると
一向に結果が帰って来ない状況です・・・。
たかだか1200行にみたない処理なのですが・・・原因不明ですが、私(Access2003)と他の人間(Access2007)の環境でも一緒でした。
No.3
- 回答日時:
以下ではどうですか?
UPDATE 商品テーブルB INNER JOIN 商品テーブルA ON [商品テーブルA].[商品名] Like "*" & [商品テーブルB].[商品名] & "*" SET 商品テーブルB.ID = [商品テーブルA].[ID];
この回答への補足
回答ありがとうございます。
何故だかわかりませんが、皆さんからいただいたSQLを実行すると
一向に結果が帰って来ない状況です・・・。
たかだか1200行にみたない処理なのですが・・・原因不明ですが、私(Access2003)と他の人間(Access2007)の環境でも一緒でした。
No.2
- 回答日時:
No.1です。
Aのテーブル更新かと思ったらBなんですね。
読み間違えてました。
一発変換だと、こんなSQLではどうでしょうか?
update 商品テーブルB inner join 商品テーブルA on 商品テーブルB.商品名=Mid(商品テーブルA.商品名,3) set 商品テーブルB.ID=商品テーブルA.ID
この回答への補足
回答有難う御座います。
サンプルのテーブルとデータ内容ですが、対象の文字列を
A1AAAA
A1AABB
の様にしていましたが、商品名の「A1」部分の文字数は定まった
文字数ではなく、それぞれの商品で違うと考えてやって下さい。
説明不足であった点、申し訳有りません。
どうぞ、お力お貸し下さい。
以上、宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・ことしの初夢、何だった?
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
会社の飲み会の幹事になり、座...
-
L2SWはARPテーブルを持っている?
-
【エクセル】データテーブルの...
-
男性と2人で飲食店に行きテーブ...
-
「テーブルに座って……」という...
-
外部キーだけのテーブル(主キ...
-
1対1のリレーション(主キー同...
-
テーブルリンク リンク元を知...
-
MySQL Workbench で、テーブル...
-
Accessで最小値と最大値を一度...
-
飲み会で、座敷orテーブルどち...
-
リレーションシップが出来ません。
-
取数計算
-
MySQLで複数テーブルを作成する
-
2つのテーブルのカウント結果...
-
まるいテーブル 円い 丸い 漢字...
-
AccessVBA でテーブルをインポ...
-
リレーションシップと外部キー...
-
Excelのテーブルでmatch関数の...
-
データベースの接続に失敗して...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
会社の飲み会の幹事になり、座...
-
男性と2人で飲食店に行きテーブ...
-
外部キーだけのテーブル(主キ...
-
「テーブルに座って……」という...
-
L2SWはARPテーブルを持っている?
-
テーブルリンク リンク元を知...
-
飲み会で、座敷orテーブルどち...
-
お金持ちのテーブル
-
まるいテーブル 円い 丸い 漢字...
-
面接のときテーブルが正面に。...
-
【エクセル】データテーブルの...
-
論理名とコメント構文(?)について
-
1つのテーブルに同じデータを参...
-
アクセスのリンクテーブル一覧...
-
シャンメリーが、硬くて開きま...
-
UTF8のテーブルをODBCドライバ...
-
【PHP】SQL文のSUM関数で出力し...
-
MySQLで複数テーブルを作成する
-
バイキングのトレーの形
-
SQLでテーブルの値を集計して、...
おすすめ情報