2009-04-25 12 views
0

C#を使用してinnerの結合を持つAccessデータベースの複数のテーブルにデータを挿入する方法はありますか?データの挿入方法は?

+0

あなたのテーブル構造のサンプルを提供することができた場合、答えを提供する方が簡単かもしれません。 – schooner

+0

私は1つで、どのような質問が出されているのか理解できません。利用可能な回答の可能性があることを明確にする必要があります。 –

+0

私はそれがちょっと押していると思います。使用可能な答えはたくさんあります。 – JoshJordan

答えて

0

私は、参加することによって、別のテーブルへの外部キーとの関係を意味すると見なします。ジョインとは、テーブルではなくクエリを指します。

必要に応じて各テーブルに1つずつ追加するだけで、親テーブルにレコードを追加し、追加したばかりの新しいレコードのキーを取得し、そのIDを使用する子テーブルへの挿入を行います。子テーブルの外部キーにする。

-1

それはAccessで動作するかどうか、私は知りませんが、あなたが試すことができます:

INSERT INTO table (col1, col2, col3) 
SELECT t1.col1, t1.col2, t2.col3 
FROM table1 t1 
INNER JOIN table2 t2 ON t1.Id = t2.Id 

あなたはさまざまなテーブルの上にこれを実行する必要がある場合は、様々な挿入を行い、ジェットエンジンは、上に複数のquerysを許可していません。 here

+0

慎重に質問を読む –

-2

私の経験によれば、標準的な方法はありませんが、これには回避策がありますが、テーブルやデータベースの構造によって異なります。

アクセスがサポートされているかどうかわかりません。トリガー、SP、および機能をサポートしています。私はそうではないと考えているので、それが本当であれば、次の回避策は有効ではありません。

  1. あなたが親に存在していない子テーブル内の値を挿入することになるかもしれないので、失敗していまし外部キー制約がある場合は、子テーブルの上にトリガーを使用しますが、可能性があります。トリガーに引数を渡すことはできないので、親にトリガーを付けることは無意味です。

  2. フロントエンドアプリケーションからストアプロシージャをコールしたり、ストアプロシージャから複数のinsertステートメントを呼び出したりする可能性があります。しかし、あなたの質問から、私はこれがあなたが "単一の挿入ステートメントから"と言う質問からやりたいとは思わないと推測します。

  3. もう1つの回避策は、関数が定義され、挿入クエリから関数を呼び出すことができるトリガーアプローチに似ているものもあります。 with関数から、子テーブルにデータを挿入します。しかし、再度整合性制約がある場合、トリガーの場合と同じ問題に終わる可能性があります。挿入が行われる前に関数が最初に実行されるためです。

  4. もう1つのアプローチがあります。あなたの必要なテーブルのフィールドの和集合であるテーブルを作成します(参照のためにそれをルートテーブルと呼ぶことができます)。次に、そのテーブルに挿入するトリガーを定義します。このルートテーブルにレコードを挿入し、必要なテーブルに適切なフィールドを挿入します。 (アトミック性のトリガーでトランザクションを使用する必要があります)。

テーブル構造があるとします。emp(empid、name); empContacts(contactid、empid、number); empAddress(addressId、empid、address); empとempContactsのフィールドの和集合である別のテーブルを作成すると、Rootemp(empid、name、contactid、number、addressId、address)という名前になります。

このテーブルのトリガーを作成し、トランザクション内のemp、empContactsおよびempAddressテーブルのトリガー挿入レコード内から作成します。

しかし、フロントエンドからは1つのinsert文を呼び出すことができますが、データベースは複数の挿入を呼び出しているため、これは回避策です。

回避策が必要ではないため、これは最善の選択肢ではない可能性があります。

PS:emp、empContact、およびempAdressの例はあまりスマートな例ではないかもしれませんが、メッセージを伝えたらと思います。

+0

無益な回答を投稿する前にJetに関する情報を見つけられないのはなぜですか? Jetにはトリガはなく、ストアドプロシージャはありません(現実的な意味で、つまりプロシージャロジックが内部にあります)。 –

+0

あなたが私の答えを読んでいれば、私はすでに「アクセスサポートトリガー、SP、および機能についてはわかりませんが、それが本当であれば、次の回避策は有効ではないと思います。 –

+0

よくわからない場合は、チェックしてください!あなたの答えの残りを完了するよりも早かっただろう。 –

2

私はACE/Jetエンジンの質問に「2つのテーブルの間にINNER JOINを作成できれば、どちらのSQL文でも両方のテーブルにINSERTを作成できますか?通常は密接に修飾子が続きます。「... FOREIGN KEY(Access =参照整合性を適用した関係)がテーブル間にある場合、参照されたテーブルのINDENTITY/AutoNumber番号が自動的に参照テーブルに追加されますか?

への答えこれらの質問はイエスです:IDENTITY列と、その後IDENTITY列を参照する列INSERT INTOVIEWIDENTITY列とその参照する列を省略することを含む、INNER JOIN(または同等)でVIEWを作成します。

はここに(私はあなたがOLE DBを使用していると仮定)ANSI-92クエリモードの構文に簡単な例です:

CREATE TABLE TableA 
(
    ID IDENTITY NOT NULL UNIQUE, 
    a_col INTEGER NOT NULL 
) 
; 

CREATE TABLE TableB 
(
    ID INTEGER NOT NULL UNIQUE 
     REFERENCES TableA (ID), 
    b_col INTEGER NOT NULL 
) 
; 

CREATE VIEW TestAB 
(
    a_ID, a_col, 
    b_ID, b_col 
) 
AS 
SELECT A1.ID, A1.a_col, 
     B1.ID, B1.b_col 
    FROM TableA AS A1 
     INNER JOIN TableB AS B1 
      ON A1.ID = B1.ID 
; 

INSERT INTO TestAB (a_col, b_col) VALUES (55, 99) 
; 
関連する問題