ACCESSでINSERT文を使ったM_品番_子品番へのデータ挿入方法と解決法

データベース

Microsoft AccessでSQLを使ってデータを別のテーブルに挿入する際、期待通りに動作しないことがあります。特に、複数の条件でJOINしたテーブルからデータをINSERTする場合、予期せぬ重複データや異常な結果が発生することがあります。この記事では、M_HI品番マスタからM_品番_子品番テーブルにデータを挿入する方法を解説し、SQL文の修正ポイントについて詳しく説明します。

1. SQL文の基本構造と問題点

質問者が提供したSQL文は、M_HI品番マスタとM_HI品番構成マスタをINNER JOINし、条件に合致するデータをM_品番_子品番テーブルに挿入しようとしています。しかし、実行結果に重複データが含まれる原因が存在します。

SQL文は次のようになっています。

INSERT INTO M_品番_子品番 ( 品番, 子品番 )
SELECT M_HI品番マスタ.品番, M_HI品番構成マスタ.子品番
FROM M_HI品番マスタ
INNER JOIN M_HI品番構成マスタ
ON M_HI品番マスタ.品番 = M_HI品番構成マスタ.品番
WHERE M_HI品番マスタ.品番 = 'J_0001' OR M_HI品番マスタ.品番 = 'W_0001';

期待する結果は、M_HI品番マスタにある品番(’J_0001′ と ‘W_0001’)に対応する構成品番が、それぞれM_品番_子品番に挿入されることです。つまり、’J_0001’には’X-0001-1’と’X-0001-2’、’W_0001’には’X-0001-1’と’X-0001-2’が挿入されることを期待しています。

2. 重複データが発生する理由

SQL文を実行した結果、’J_0001’と’W_0001’のデータが重複して挿入されてしまっています。これは、M_HI品番マスタとM_HI品番構成マスタのJOIN条件が正しく設定されていないか、テーブルのデータ構造に問題があることが考えられます。

具体的には、INNER JOINの部分で、M_HI品番マスタの品番が’M_HI品番構成マスタ’の品番に一致するすべての子品番を取り出しているため、’J_0001’と’W_0001’の品番に対してそれぞれ2回ずつデータが結合されている結果、重複が発生しています。

3. SQL文の修正方法

重複データを防ぎ、正しくデータを挿入するためには、次のようにSQL文を修正することができます。

INSERT INTO M_品番_子品番 ( 品番, 子品番 )
SELECT M_HI品番マスタ.品番, M_HI品番構成マスタ.子品番
FROM M_HI品番マスタ
INNER JOIN M_HI品番構成マスタ
ON M_HI品番マスタ.品番 = M_HI品番構成マスタ.品番
WHERE M_HI品番マスタ.品番 IN ('J_0001', 'W_0001');

この修正により、品番が’J_0001’または’W_0001’に該当するデータのみが、構成マスタに対応する子品番とともに挿入されます。

さらに、’IN’句を使用することで、複数の条件を簡潔に指定でき、より可読性の高いSQL文になります。

4. データの重複を防ぐための他のアプローチ

重複データを防ぐためには、SQL文にWHERE句やJOIN条件を適切に設定することが重要です。例えば、次のようにDISTINCTを使用することでも、重複する行を排除できます。

INSERT INTO M_品番_子品番 ( 品番, 子品番 )
SELECT DISTINCT M_HI品番マスタ.品番, M_HI品番構成マスタ.子品番
FROM M_HI品番マスタ
INNER JOIN M_HI品番構成マスタ
ON M_HI品番マスタ.品番 = M_HI品番構成マスタ.品番
WHERE M_HI品番マスタ.品番 IN ('J_0001', 'W_0001');

この方法を使用することで、仮に重複する行があった場合でも、INSERT文が実行される前に重複が排除されます。

5. まとめ

Microsoft Accessで複数のテーブルからデータを挿入する場合、JOIN条件を正しく設定し、WHERE句で適切なデータを絞り込むことが重要です。重複データが発生する原因は、JOINの条件が意図した通りに設定されていないことが多いので、SQL文を確認し、必要な修正を加えることが解決への近道となります。特に、’IN’句を使用して条件を絞り込むことで、より効率的で可読性の高いSQL文を作成できます。

コメント

タイトルとURLをコピーしました