Microsoft Access 掲示板

SQLでの不一致レコード抽出

5 コメント
views
4 フォロー

下記のようなテーブルがあります。
1.テーブル名 tbl見積(親テーブル)
 フィールド 見積番号(主キー)、・・・

2.テーブル名 tbl見積Sub(子テーブル)
 見積番号(主キー)、SubID(主キー)、見積品ID、・・・

見積番号で結合しています。

他に
3.テーブル名 tbl見積品
 見積品ID(主キー)、見積品名、・・・

親テーブルからレコードを削除すると、子テーブルの該当レコードも削除されます。
その際、子テーブルにある見積品IDが他の見積番号で使われていなければ、tbl見積品から見積品IDも削除するということを実行しようとしています。

そのため、削除対象となる見積品IDを抽出したく、SQLにて不一致クエリを作成しようと下記を行いました。
1は抽出元のSQL、2は比較のSQL、3は差分のSQLです。

  1. 今開いている、見積番号のレコードの見積品ID一覧
    SQL_extract = "SELECT 見積品ID FROM tbl見積Sub WHERE 見積番号 = '" & Me.見積番号 & "' GROUP BY 見積品ID HAVING 見積品ID Is Not Null"

  2. 他の見積番号の見積品ID一覧
    SQL_comparison = "SELECT 見積番号,見積品ID FROM tbl見積Sub WHERE 見積番号 <> '" & Me.見積番号 & "'"

3.この2つのSQL文から不一致のレコードを抽出するSQLを作成したいのですが、どのようにして1と2を組み合わせたらいいのでしょうか?作ってみましたがうまくいきません。
SELECT 見積品ID FROM [" & SQL_extract & "]. AS extract LEFT JOIN [" & SQL_comparison & "]. AS comparison ON extract.見積品ID = comparison.見積品ID WHERE comparison.見積品ID Is Null;

宜しくお願い致します。

あん
作成: 2023/04/06 (木) 14:02:15
最終更新: 2023/04/06 (木) 16:50:08
通報 ...
1
りんご 2023/04/06 (木) 18:45:34 935bc@0e907

その際、子テーブルにある見積品IDが他の見積番号で使われていなければ、tbl見積品から見積品IDも削除するということを実行しようとしています。

 あまりやらないような事をやろうとしているように見えてしまいました。
 親子テーブルとtbl見積品は別々に削除する、必要に応じて。これでは駄目なのでしょうか?

2
りんご 2023/04/06 (木) 20:26:16 935bc@0e907 >> 1

tbl見積Subとtbl見積品で不一致クエリ。

tbl見積Sub.見積品IDtbl見積品.見積品ID
11
Null2
Null3

↓Nullで抽出

tbl見積Sub.見積品IDtbl見積品.見積品ID
Null2
Null3
↓担当者がフォームで削除する見積品IDを選択・抽出。例えば、見積品IDが2
tbl見積Sub.見積品IDtbl見積品.見積品ID
Null2

選択クエリの場合、削除クエリに変更。親子テーブルの連鎖削除に続けて、担当者に削除の是非を判断させるとか。

3
あん 2023/04/07 (金) 10:37:56 927ea@d0fce

りんご様

ご回答ありがとうございます。

会社が修理業を行なっていて、修理品ごとに修理IDが振られています。
修理IDは実際に受注してから発番されます。

以下は見積業務に基づいて設計した内容です。
見積は1つの見積案件の中に複数の修理品があり、同修理品の別途の追加見積や再見積があります。

以下は設計したものです。

1つの案件を「見積案件番号」として管理して、その案件に追加や再見積はサフィックスで追加しています。
例)見積案件番号10001、サフィックス0、見積番号10001-00
見積番号は、ハイフン前が見積案件番号で、後ろがサフィックス(99件まで考慮しています。100件目には作成できないとメッセージされます。)
最初の新規見積は、10001-00、同案件の次の見積は10001-01。別案件の新規見積は10002-00。
つまり、1つの案件で複数の見積があります。

また、見積の修理品を見積品IDとしています。
同じ見積案件内で別の見積でも、同じ修理品(見積品ID)を見積もっています。

そのため、ある見積を削除するに伴い、その見積内で使用されている見積品IDが、同案件の別の見積で使われていなければ、一緒に見積品IDも削除したく考えました。

見積品IDを必要とする理由は、見積もった修理品(見積品ID)と実際受注して修理した修理品(修理ID)をリンクさせるためです。
見積品IDの見積原価と修理IDの実際原価の比較等のためです。

4
あん 2023/04/07 (金) 10:46:10 927ea@d0fce

りんご様

追加のご回答で、理解出来ました。

見積データを削除する前に見積品IDを削除することを考えていたので、複雑になってしまっていたようです。
削除後なら、単純に「tbl見積Subとtbl見積品で不一致クエリ。」で出来そうです。

ちょっとやってみます。
ありがとうございます。

5
あん 2023/04/07 (金) 12:45:49 927ea@d0fce

りんご様

「tbl見積Subとtbl見積品で不一致クエリ。」で出来ました。
ありがとうございました。