利用規約の変更について

以下の様な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 を使えば上手くいのですが、
部分一致の場合どの様にすれば良いのか、行き詰っています。

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAccessクエリでの、LIKE条件

お世話になっております。
早速質問ですが、

Aテーブル
CD 名称
1  大阪府
2  京都府

Bテーブル
名称
大阪市伊丹区
京都府京都市
京都府宇治市

とデータがあったとします。
Aテーブルの名称フィールドとBテーブルの名称を照らし合わし、
Bテーブル名称一部とAテーブルの名称が合致していたるデータを、AテーブルのCDをつけて表示したいのです。

結果↓
CD 名称
1  大阪市伊丹区
2  京都府京都市
2  京都府宇治市

こういう事はクエリでできますか?

有識者の方ご教授お願い致します。

Aベストアンサー

SQLを使えば結合条件に式もかけます
それでやりますか
とりあえずクエリデザインビューで名称同士を結合したクエリを作ります
(もちろんこれでは何も表示されません)
出来たクエリをSQLビューで開き
ON Bテーブル.名称 = Aテーブル.名称

ON Bテーブル.名称 like Aテーブル.名称 & "*"
と書き換えます

出来上がり
SELECT Aテーブル.CD, Bテーブル.名称
FROM Aテーブル INNER JOIN Bテーブル ON Bテーブル.名称 like Aテーブル.名称 & "*";

Q<ACCESS>別テーブルのレコードのテキストデータが中に含まれるレコードを抽出する方法を教えてください

勉強不測で大変悩んでいます。お分かりになる方教えてください。

A(マスタ_登録済)とB(マスタ_仮登録)という2つのテーブルがあり、それぞれに「アカウント」(テキスト型)というフィールドが存在しています。

Bに存在する全レコードのいづれかの「アカウント」フィールドに入力されている文字列が文字列中に含まれているAのレコードの一覧を出力したいのですが、どうしたらできるでしょうか。

たとえば、
[A]
inu
inushiba
inupo
neko
nekotama
nekoshiro

[B]
inu
nekota

とレコードがそれぞれ存在していた場合、
出力したいレコードは

inu
inushiba
inupo
nekotama

となります。

よろしくお願いいたします。

Aベストアンサー

こんな方法もできます。
クエリにテーブルAとBを選択、結合しない。
(上記で全結合の状態になります。)
テーブルAのみ全表示
テーブルAのアカウントの抽出条件欄に
LIKE [B]![アカウント]&"*"

もし nekoinu のように中間や後ろも出力の場合は
LIKE "*"&[B]![アカウント]&"*"

Qアクセス 部分一致の抽出

アクセスの部分一致の抽出が出来ず困ってます。
テーブル1       テーブル2
あいうえお       あいうえお090
かきくけこ        かきくけこ090
さしすせそ       がぎぐげご010
なにぬねの       たちつてと050
               なにぬねの020
結果
あいうえお
かきくけこ
なにぬねの
 
上のような2つのテーブルでテーブル2がテーブル1と完全一致していれば(前方完全一致が理想です。)それ以外に余計な物が後ろについていても抽出し、結果となるようにしたいのですが、スキルがなく詰まってます。
今回初めてアクセスに触り「できる」の本を見ながらテーブルを作成するところまでは出来たのですが、周りに聞く人もおりません。
皆様のお知恵をお貸しください。
よろしくお願いいたします。
okwave内の他の場所でSQLかVBAかどちらでやりたいのか書いたほうが良いとアドバイスをもらいましたが、私はどちらも自分で使えないレベルです。勝手で申し訳ないのですが、お力をお貸しください。

Aベストアンサー

部分一致は「LIKE」を使います。
http://www.seta.media.ryukoku.ac.jp/manual/office/access/query/selection.html

クエリを使う方法を示します。添付図を参照してください。
ポイントは
・リレーションシップ(テーブル同士をつなぐ線)は張らない(あれば削除する)。
・「抽出条件」を「like [テーブル1].[fld1] & "*"」とする
以上です。

QAccess]2つのテーブルを比較してフィールドの一部が一致したデータを抽出

2つの名簿テーブルを比較してどちらのテーブルにも含まれている個人を抽出したいと考えております。

テーブル名とフィールドは以下のとおりです。

====================
テーブル名「名簿A」

氏名
電話番号
住所
メールアドレス
====================
テーブル名「名簿B」



電話番号
住所
メールアドレス
====================

たとえば、この2つの名簿をメールアドレスで一致したものを抽出する場合は選択クエリのデザインビューで「名簿A」のフィールドを読み込ませ、
メールアドレスフィールドの抽出条件として

Like [名簿B].[メールアドレス]

を入れれば抽出ができたのですが、メールアドレスは、名簿ごとに記入されていたりしなかったりするので、名前での一致を行いたいと思っています。

ここで問題なのが、名簿Aは「氏名」で入力されているのに対し、名簿Bでは「姓」と「名」が別フィールドになっております。

そこで自分なりにやってみたのが、選択クエリのデザインビューで「氏名」のフィールドの抽出条件として

Like (*[名簿B].[姓]*)

を設定するものでした。
これがうまくいけば最終的には

Like (*[名簿B].[姓]*) And Like (*[名簿B].[名]*)

という風にして、名簿Aの「氏名」フィールドに名簿Bの「姓」も「名」も入っているものを抽出できるかな?と考えたのですが、上記のように入力すると、自動的に

Like ("*[名簿B].[姓]*")

となってしまい、何も抽出されなくなってしまいました。

このような方法では希望する抽出は行えないのでしょうか?

お分かりのかた、よろしくお願いいたします。

2つの名簿テーブルを比較してどちらのテーブルにも含まれている個人を抽出したいと考えております。

テーブル名とフィールドは以下のとおりです。

====================
テーブル名「名簿A」

氏名
電話番号
住所
メールアドレス
====================
テーブル名「名簿B」



電話番号
住所
メールアドレス
====================

たとえば、この2つの名簿をメールアドレスで一致したものを抽出する場合は選択クエリのデザインビューで「名簿A」のフィールドを読み込ませ、
メール...続きを読む

Aベストアンサー

> 名簿Aの「氏名」欄には姓と名の間にスペースが入っているものがあり

[名簿B].[姓] & [名簿B].[名]を使った時のクエリで考えてみます。

クエリをSQLビューで表示した時、抽出条件のところは

[名簿A].[名前] Like [名簿B].[姓] & [名簿B].[名]
とか
[名簿A].[名前] = [名簿B].[姓] & [名簿B].[名]

になっていると思います。

[名簿A].[名前]の部分に細工して、Replace([名簿A].[名前]," ","")に書き換えます。
(Replace で空白を削除してあげます)

それをもとに
Replace([名簿A].[名前]," ","") = [名簿B].[姓] & [名簿B].[名]
としてみるとどうなりますか。


※バージョンによっては、クエリ内で Replace が使えないものがあったかと思います。
その時には、補足なりに記述してください。
(対処方法はあります)

QAccessのテーブルデータを一気にVBAで追加したい・・

Accessのテーブルデータを一気にVBAで追加したい・・

Accessに一時商品登録データというテーブルがあり、
問題なければ商品登録データにデータを流し込みたいと思っています

テーブルのデータ構造は全く同じです

VBAで一時商品登録のテーブルから一件ずつデータを読み取って
商品登録データに追加することは出来るのですが
一気にデータを追加する方法があれば教えていただけないでしょうか?

よろしくお願いいたいます

Aベストアンサー

本当にいろいろな方法があります。

一番簡単なのは、
あらかじめ「追加クエリ」を作成しておき

 Docmd.OpenQuery "追加クエリ名"

あるいは DAO で

 Set dbs = CurrentDB
 dbs.Excute "追加クエリ名"

追加クエリを使用しない場合は
追加クエリの SQL文 に相当するSQL を 実行。

 strSQL="INSERT INTO 商品登録データ SELECT 一時商品登録データ.* FROM 一時商品登録データ"

 Docmd.RunSQL strSQL

あるいは DAO で

 Set dbs = CurrentDB
 dbs.Excute strSQL

とか。

直書き、間違いがあったら御免。

QACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ

ACCESSで空白のデーターをクエリで判定/識別する方法を教えてください。
EXCELでは空白を""で判定/識別表していますがACCESSではどうなるのでしょうか。

下の例はフィールドに試験番号があればその番号を、空白なら”欠席”と表示しようとしています。
IIf(([試験番号]="空白の場合何を入れる?"),[試験番号],"欠席")

Aベストアンサー

もうひとつの書き方は
式1: IIf([試験番号] Is Not Null,[試験番号],"欠席")
第2、第3引数の、質問の順序にあわせるとこうなる。

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QACCESSで条件によってフォーム上のフィールドの色を変更

一覧形式のフォームがあり、条件によって色を変更したいのですが、その条件というのが下記のような感じです。

フィールドA | フィールドB | フィールドC | チェックボックス
チェックボックスのチェックがあったら、フィールドA・B・Cの色をグレーにする。
チェックがなかったら白いまま。

というものです。
条件付書式だと、色を変更するフィールドそのもののデータを参照にしないといけないんですよね?
フォームオープンのところにVBAをかいてみたんですが、ひとつひとつは認識してないみたいで…。
どのようにすればいいのでしょうか?

よろしくお願いします。

Aベストアンサー

フォームのデザイン画面で3つのフィールドすべて選択し条件付書式画面を表示させる。
条件1のコンボで”式”を選択。
右側の欄に[チェックボックスのコントロール名]=True
と入力し、バケツアイコンでグレーを選択。
(もちろん1フィールドづつ設定してもOK)

QACCESS テーブルを見比べて、一致したレコードを抽出したいです

ACCESSで、以下のデータ抽出をしたいです。
別々のテーブルで、番号の一致したものだけ取り出したいです。
どのようにすればよいのでしょうか?
よろしくお願いします。

 Aテーブル     Bテーブル
  ・001 ***     ・002 *** 
  ・002 ***     ・004 ***
  ・003 ***     ・001 ***

求める答え

  ・001 ***  
  ・002 *** 

Aベストアンサー

> もう少しくだいて説明頂くとわかるのですが、
判ってしまえば簡単なんですが、言葉だけで説明するのは大変なんですよね。
「自動車の運転を、動作や絵を使わず文字だけで教えろ」と言われているようなものなので....
データベースを開き、
1.「クエリ」をクリック。
2.「新規作成」をクリック。
3.「デザインビュー」を選択して「OK」をクリック。
4.「テーブルの表示」から、「Aテーブル」をクリックし、さらに「CTRL」キーをおしたまま「Bテーブル」をクリックして、
 「Aテーブル」と「Bテーブル」が選択されている状態にして「追加」をクリック。
5.「閉じる」をクリックして「テーブルの表示」パネルを閉じる。
6.「Aテーブル」のコードの部分を「Bテーブル」のコード部分へドラッグする。
7.両テーブルのコード部分が線で結ばれていることを確認する。
8.「Aテーブル」の表示したいフィールドを、下の表にドラッグします。

このへんで、カンベンして下さい...

QACCESSのクエリー抽出条件にIIFを使用して

コンボボックスの値を抽出条件にしたクエリーを作成しています。
コンボボックスにて"ALL"を選択したときに、全レコードを表示したく、
以下の式を入れたのですが全表示がされません。

IIf([Forms]![テーブル名]![コンボ値]="ALL",Like "*",[Forms]![テーブル名]![コンボ値])

Like "*" の部分がいけないのでしょうか?
(偽の場合は選択した値のレコードが抽出されます)

どなたか教えてください、よろしくお願いいたします。

Aベストアンサー

>IIf([Forms]![テーブル名]![コンボ値]="ALL",Like "*",[Forms]![テーブル名]![コンボ値])
この条件は、抽出したいフィールドの「抽出条件」の所に入力しているんですよね?

ちょっと内容を変えまして・・・
(1)「抽出条件」ではなく、「フィールド」の行に入力してください。
 (つまり、抽出用の新しいフィールドを作成するということです。)
(2)式は
式1: IIf([Forms]![テーブル名]![コンボボックス名]="ALL",True,[テーブル名]![コンボボックス名]=[Forms]![テーブル名]![コンボボックス名])
にしてください。
(3)IIfを入力したフィールドの「抽出条件」に True と入力します。
 (Trueの囲い文字はいりません。)

どうでしょう?ちゃんと出ますよね・・・?
ただし、フィールドを作ったわけですから、
クエリのデータシートビューには必要のない、-1などが表示されたフィールドが表示されますよね。
これは、デザインビューに戻って、表示のチェックボックスをオフにすれば解決します。

IIFというのは、ExcelのIF関数とはちょっとイメージが違います。
以下解説↓

今回の条件式の部分には、[コンボ]="ALL"という評価式(←ポイント!)が入力されています。
Excelでは条件式というイメージが強いですが、
IIFは評価式という意味です。
つまり、この評価式自体がTrueとFalseを持つということです。
IIf([Forms]![テーブル名]![コンボボックス名]="ALL",・・・・)という式で、
条件をALLとしたら・・・
評価結果=True となります。
そして真の場合の処理にTrueを指定することで、IIFの戻り値がTrueになります。
条件にALL以外を入力すると・・・
評価結果=False となります。
そして偽の場合の処理の戻り値が、ALL以外の条件になります。
抽出条件にもTrueを入力したのは、無条件に全件が表示されるのを防ぐためです。

これは、表示をオンにして動作確認すると分かりやすいかも知れませんね。
または、とりあえず現象を直して、理解は後々・・・でもよいかも知れません。
健闘を祈ります!

>IIf([Forms]![テーブル名]![コンボ値]="ALL",Like "*",[Forms]![テーブル名]![コンボ値])
この条件は、抽出したいフィールドの「抽出条件」の所に入力しているんですよね?

ちょっと内容を変えまして・・・
(1)「抽出条件」ではなく、「フィールド」の行に入力してください。
 (つまり、抽出用の新しいフィールドを作成するということです。)
(2)式は
式1: IIf([Forms]![テーブル名]![コンボボックス名]="ALL",True,[テーブル名]![コンボボックス名]=[Forms]![テーブル名]![コンボボックス名])
にして...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報