Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Access 2016)
キーワードで結合する(その2)
投稿日時: 20/11/24 17:52:48
投稿者: パピープ

こんにちは。
この前、ここに質問して回答を「Suzu」さんに頂きました。
これはうまくいったのですが、以下の場合にはどうすればいいでしょうか?
 
テーブル1
コード 品名 キーワード1  キーワード2  除外キーワード
001 ABC  人    リットル  A館
001 EFG  個    トン
002 HIJ  品    皿
  
テーブル2
コード   摘   要
001 10人準備(1リットル×10本)
001 5個2階に設置
001 10日に50皿
002 5皿配膳
002 3本発注
 
摘要一致でテーブル2にテーブル1の品名を結合
コード   摘   要          品名
001 10人準備(1リットル×10本)B館  ABC
001 10人準備(1リットル×10本)A館   −
001 5個2階に設置          EFG
001 10日に50皿           −
002 5皿配膳             HIJ
002 3本発注             −
〇キーワードで一致しなければ「−」を表示。
テーブル1で、除外キーワードが入っている場合には、
テーブル2で該当するものは品名欄を「−」とし、除外に
該当しなければ品名欄に品名を表示します。
 
基礎がダメなんで、うまくいきません・・。

回答
投稿日時: 20/11/25 09:27:52
投稿者: Suzu

前回、

SELECT テーブル2.コード, テーブル2.摘要, Nz(Tmp.品名,"-") AS 品名
FROM テーブル2 LEFT JOIN
  (SELECT テーブル2.コード, 摘要, 品名
   FROM テーブル2, テーブル1
   WHERE (InStr(摘要,キーワード1)+InStr(摘要,キーワード2)>0) AND ([テーブル2].[コード]=[テーブル1].[コード])
  ) AS Tmp
 ON テーブル2.コード=Tmp.コード AND テーブル2.摘要=Tmp.摘要
を提示させて頂きました。
 
  (SELECT テーブル2.コード, 摘要, 品名
   FROM テーブル2, テーブル1
   WHERE (InStr(摘要,キーワード1)+InStr(摘要,キーワード2)>0) AND ([テーブル2].[コード]=[テーブル1].[コード])
  ) AS Tmp
の部分は、サブクエリです。
 
 
SELECT テーブル2.コード, 摘要, 品名
FROM テーブル2, テーブル1
WHERE (InStr(摘要,キーワード1)+InStr(摘要,キーワード2)>0) AND ([テーブル2].[コード]=[テーブル1].[コード])
を実行してみてください。
 
 
今回提示させて頂くのは、サブクエリとSELECT句をチョッといじって。。
SELECT [テーブル2].[コード], [テーブル2].摘要, 品名, 除
FROM テーブル2 LEFT JOIN 
  (
   SELECT [テーブル2].[コード], [テーブル2].摘要, [テーブル1].品名, InStr([摘要],[除外キーワード]) AS 除
   FROM テーブル2, テーブル1
   WHERE ([テーブル2].[コード]=[テーブル1].[コード]) AND InStr([摘要],[キーワード1])+InStr([摘要],[キーワード2])>0
  )  AS Tmp ON ([テーブル2].摘要 = Tmp.摘要) AND ([テーブル2].[コード] = Tmp.[コード]);
です。
 
完成品ではありませんが、ここから更にイジれば、希望のものが得られます。
ヒントは、前回・今回 提示したどちらの SQL にも含まれています。
考えてみてください。

投稿日時: 20/11/30 10:37:04
投稿者: パピープ

Suzu様
 
返事が遅くなり申し訳ございません。
色々、見直してみたりしているうちに訳が分からなくなってきて、
再度考えたりしていました。
 
テーブル1
コード 品名 キーワード 除外キーワード
001 ABC  人    A館
001 DRA  人
001 EFG  個
002 HIJ  品
 
テーブル2
コード   摘   要
001 10人準備(1リットル×10本)
001 15人分配膳 A館
001 5個2階に設置
002 5個配膳
 
結果
コード   摘   要        品名
001 10人準備(1リットル×10本)  ABC
001 15人分配膳 A館        DRA
001 5個2階に設置         EFG
002 5個配膳            -
 
〇行いたいこと
※テーブル2のコード001についてです。
まず摘要を確認
 ・キーワードが「人」
 @除外キーワードが摘要にある場合→表示する品名はDRA
 A除外キーワードが摘要にない場合→表示する品名はABC
 
考え方を逆にして、除外キーワードを、更に含むキーワードにする
という考え方でもいいのかなと思ったりもします。
 
最初から、行いたいことをキチンと書けということではありますが、
再度お知恵を拝借できると幸いです。

回答
投稿日時: 20/11/30 16:54:44
投稿者: Suzu

考え方として、今まで提示していたのは
 
各テーブルの、全組み合わせを作成し、摘要にキーワード(NGキーワード)が含まれているかを判定していまっした。

コード	摘要			品名	キーワード1	キーワード2	除外ワード
001	10人準備(1リットル×10本)A館	ABC	人(○)	リットル(○)	A館(○)	該当
001	10人準備(1リットル×10本)A館	EFG	個(×)	トン(×)	(×)
001	10人準備(1リットル×10本)A館	HIJ	品(×)	皿(×)		(×)
001	5個2階に設置			ABC	人(×)	リットル(×)	A館(×)	なし
001	5個2階に設置			EFG	個(○)	トン(×)	(×)
001	5個2階に設置			HIJ	品(×)	皿(×)		(×)
001	10日に50皿			ABC	人(×)	リットル(×)	A館(×)
001	10日に50皿			EFG	個(×)	トン(×)	(×)
001	10日に50皿			HIJ	品(×)	皿(○)		(×)	該当
001	10人準備(1リットル×10本)B館	ABC	人(○)	リットル(○)	A館(×)	該当
001	10人準備(1リットル×10本)B館	EFG	個(×)	トン(×)	(×)
001	10人準備(1リットル×10本)B館	HIJ	品(×)	皿(×)		(×)
002	5皿配膳				ABC	人(×)	リットル(×)	A館(×)
002	5皿配膳				EFG	個(×)	トン(×)	(×)	
002	5皿配膳				HIJ	品(×)	皿(○)		(×)	該当
002	3本発注				ABC	人(×)	リットル(×)	A館(×)	なし
002	3本発注				EFG	個(×)	トン(×)	(×)
002	3本発注				HIJ	品(×)	皿(×)		(×)

上記でいう、
・キーワード1またはキーワード2または除外ワード のどれかが (○)の 【該当】レコードを表示
・キーワード1、キーワード2、除外ワード すべてが、 (×)の 【なし】の場合には、品名を『ー』として表示をしていました。
 
これは、互いのレコードが独立しているので判断できました。
 
 
今回は、
コード	摘要				品名	キーワード	除外キーワード	
001	10人準備(1リットル×10本)	ABC	人(○)		A館(×)	これ	
001	10人準備(1リットル×10本)	DRA	人(○)			これ
001	10人準備(1リットル×10本)	EFG	個(×)		
001	15人分配膳 A館			ABC	人(○)		A館(○)	これ
001	15人分配膳 A館			DRA	人(○)			これ
001	15人分配膳 A館			EFG	個(×)			
001	5個2階に設置			ABC	人(×)		A館(×)	
001	5個2階に設置			DRA	人(×)			
001	5個2階に設置			EFG	個(○)			
001	5皿配膳				ABC	人(×)		A館(×)
001	5皿配膳				DRA	人(×)		
001	5皿配膳				EFG	個(×)		

 
の【これ】は他のレコードを参照しないと判断できません。
このあと、更に『ー』を表示させるための仕組みを組み込まなければなりません。
 
なので、前回より更に面倒であり、処理時間も要する事になります。
 
 
前回の構成では 適用できないのでしょうか?

投稿日時: 20/11/30 17:47:52
投稿者: パピープ

Suzu様
 
お世話になっております。
早速の回答、ありがとうございます。
 
摘要の入力が、人によって違い悩んでおります。
例えば、「10人分配膳 A館」という摘要も、人によっては
「10人A館配」と書く人もいたり(これの場合、品名はDRA)
「10人・配」とだけ書く人もいます(これの場合、品名はABC)。
今後の入力を直せばよいのですが、過去のは修正したくない(一応書替禁止)
であるため、過去のデータも有効に使えないものか悩んでいました。
 
摘要にA館と書いていない場合には、A館での手配ではない。昨年までは
B館で使う品名は、「DRA」以外になかった。なので、摘要にA館が無ければ
品名にDRAをセットする。という分に考えました。
 
エクセルだと遅いので、アクセスで、選択クエリでやれるんじゃないか?という思い付きから
やってみたのですが、グループ化してもレコードが複数表示され、もう少し良い方法が
ないものかと思い悩み、追加質問させて頂きました。
目で見ている分には簡単そうですが、意外と難しいんだなと痛感した次第です。
 
時間の都合から、頂いたSQLの結果をエクスポートし、エクセルで除のフィールドが1以上を
修正することとします。時間は掛かりますがやらないよりはましなので。
手が空いたら、また考えてみます。
お手数をお掛けしました。

投稿日時: 20/12/01 07:32:42
投稿者: パピープ

Suzu様
 
こちらの質問、一旦解決済にさせて頂きます。
色々と考えて頂き、本当にありがとうございました。
感謝申し上げます。
また掲示板でお会いすることがございましたら、宜しくお願い致します。