Access (一般機能)

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

 
(Windows 10 Pro : Access 2016)
複数テーブルの複数フィールドで一致するレコードを抽出
投稿日時: 20/08/19 20:14:52
投稿者: 忠犬

質問失礼します。
 
4つのテーブルとフィールドが下のようにあります。
 
テーブル1
ID 社員番号   枝番号   社員名
1  00123   45   あいう えお
2  05689  25634 かきく けこ
3  36789    3   さしすせそ
 
テーブル2
ID 社員番号   枝番号   社員名
1  00123   45   あいう えお
2  23458  365   たちつ てと
3  58904    3   なにぬ ねの
 
テーブル3
ID 社員番号   枝番号   社員名
1  89323  271   はひふ へほ
2  23458  365   たちつ てと
3  36789    3   さしすせそ
 
テーブル4
ID 社員番号   枝番号   社員名
1  72635  89    まみむ めも
2  02876  498   やいゆ えよ
3  67398  98    らりる れろ
 
テーブル1のレコードがテーブル2から4にあるどれかのレコードと一致した場合、
新しくテーブル5にID、社員番号、枝番号、社員名を表示するクエリを作成したいです。
 
上の例でいえば
テーブル5
ID 社員番号   枝番号   社員名
1  00123   45   あいう えお
3  36789    3   さしすせそ
 
となるようにしたいです。
以前こちらで質問させていただき、その際受けたアドバイスで
下のようなクエリを作成しましたが、
下のクエリは「テーブル1のうち、テーブル2から4と一致しないレコード」
を抽出するレコードになるので、
このクエリを改変して上記のようなレコードを抽出できないかなと
考えています。
どこを変えたらできるようになるのかどうかご教示ください。
 
INSERT INTO テーブル5(ID)
SELECT max(q.ID) AS ID
FROM(SELECT ID,社員番号,枝番号,1,As flag
FROM テーブル1
UNION ALL
SELECT 0,社員番号,枝番号,2
FROM テーブル2
UNION ALL
SELECT 0,社員番号,枝番号,3
FROM テーブル3
UNION ALL
SELECT 0,社員番号,枝番号,4
FROM テーブル4
)AS q
GROUP BY q.社員番号,q.枝番号,
HAVING(((Max(q.flag))=1))
ORDER BY Max(q,ID);
 
 

投稿日時: 20/08/19 22:38:22
投稿者: 忠犬

投稿したあと気づいたのですが、
HAVING(((Max(q.flag))=1))
の部分を
 
HAVING(((Max(q.flag))>1))
 
こうしたらできるのかもしれませんね。
明日会社で試してみますが、
引き続き「こうした方がいい」などのご意見ありましたら
ご教示ください。
 
なお、テーブルは複数でない方がいいというご意見も前回頂戴しましたが
いろいろな事情があってこうしてます…。
 

回答
投稿日時: 20/08/19 23:25:11
投稿者: よろずや

HAVING(((Max(q.flag))>1 AND (Max(q.ID))>0))
ですね。
 
別解:

INSERT INTO テーブル5(ID, 社員番号, 枝番号, 社員名)
SELECT * FROM テーブル1 AS T1
WHERE EXISTS(SELECT * FROM テーブル2 AS T2
      WHERE T1.社員番号 = T2.社員番号 AND T1.枝番号 = T2.枝番号)
   OR EXISTS(SELECT * FROM テーブル3 AS T3
      WHERE T1.社員番号 = T3.社員番号 AND T1.枝番号 = T3.枝番号)
   OR EXISTS(SELECT * FROM テーブル4 AS T4
      WHERE T1.社員番号 = T4.社員番号 AND T1.枝番号 = T4.枝番号);

投稿日時: 20/08/20 21:36:47
投稿者: 忠犬

よろずやさま
 
 
遅くなりましたが、どうもありがとうございます!
 
HAVING(((Max(q.flag))>1 AND (Max(q.ID))>0))
 
こちらで試してみました!
が、元々
INSERT INTO テーブル5(ID)
 
こうしていたため、おそらく合っているのだろうけれど、
IDしか表示されず、
INSERT INTO テーブル5(ID,社員番号,枝番号,社員名)
としたところ
「クエリの値と出力するフィールドの数が一致しません」
と表示されてしまいました。
 
テーブル1のフィールドが実際は(といってもダミーですが)
ID 社員番号   枝番号   生年月日 住所1  住所2  住所3 社員名
のようになっているのでうまくいかないのかもしれません。
 
よろずや様にご提案いただいた別解を試したところ、
今度は別のエラーが出て、エラー内容を調べているうちに
データを不注意にも消してしまい、その修復に時間がかかってしまう始末。
 
別解についても、おそらくフィールド数が違うため出たエラーだと思ってるのですが
(ただ、エラー内容を失念してしまいました。)
例えば
INSERT INTO テーブル5(ID,社員番号,枝番号,,,,,社員名)
とテーブル1のフィールド数を合わせたらうまく表示されるのか、
それとも別の解があるのか、お手数ですがご教示いただけますでしょうか
 

回答
投稿日時: 20/08/20 22:30:41
投稿者: よろずや

別解:

INSERT INTO テーブル5(ID, 社員番号, 枝番号, 社員名)
SELECT ID, 社員番号, 枝番号, 社員名 FROM テーブル1 AS T1
WHERE EXISTS(SELECT 1 FROM テーブル2 AS T2
      WHERE T1.社員番号 = T2.社員番号 AND T1.枝番号 = T2.枝番号)
   OR EXISTS(SELECT 1 FROM テーブル3 AS T3
      WHERE T1.社員番号 = T3.社員番号 AND T1.枝番号 = T3.枝番号)
   OR EXISTS(SELECT 1 FROM テーブル4 AS T4
      WHERE T1.社員番号 = T4.社員番号 AND T1.枝番号 = T4.枝番号);
ではいかが。

投稿日時: 20/08/21 22:53:30
投稿者: 忠犬

よろずや様
 
ありがとうございます!
ご回答いただいたさらなる別解で試してみました。
 
クエリを保存しようとすると、フィールド名やテーブル名の先頭に全角数字を使ってないのに
「クエリ式社員名 FROM テーブル1 の構文エラー:演算子がありません」
と出てしまいました。
 
テーブル1についてはダミーデータで試していたので空欄のフィールドもあり
それが原因かなと思っていたのですが、フィールド埋めても同じエラーのままでした。
 
ここまで教えていただいたのに本当に不甲斐なく申し訳ないです。
何かほかに原因として考えられることはありますでしょうか

回答
投稿日時: 20/08/21 23:12:17
投稿者: よろずや

ACCESS の仕様というか癖というか、オブジェクト名に全角・半角の混在でエラーになることがあります。
 
英数字やカタカナ等、同じ文字が全角・半角の両方にあるものは、
英字/数字/英記号は半角に統一すること。
カタカナ/カナ記号は全角に統一すること。
 
テーブル名やフィールド名を再度よく確認してください。

投稿日時: 20/08/22 23:14:11
投稿者: 忠犬

よろずや様
 
ありがとうございます!
もう1度よく見直してみます。
 
長々とお付き合いいただきどうもありがとうございました!