2

私が本当に理解できないSQL文について助けていただければ幸いです。

私がやりたいことはかなり単純です。2 つの異なるテーブルから値を取得し、新しい行が 2 つのテーブルのいずれかに挿入されたときにそれらをマスター テーブルにコピーする必要があります。

この問題は、おそらく次のように説明するのが最も適切です。

productcategories、regioncategories、mastertable の 3 つのテーブルがあります。

         ---------------------------
TABLE:   PRODUCTCATEGORIES
         ---------------------------
COLUMNS: CODE       | DESCRIPTION
         ---------------------------
VALUES:  BOOKS      | Books
         ---------------------------

         ---------------------------
TABLE:   REGIONCATEGORIES
         ---------------------------
COLUMNS: CODE       | DESCRIPTION
         ---------------------------
VALUES:  EU         | European Union
         ---------------------------

         ------------------------------------------
TABLE:   MASTERTABLE
         ------------------------------------------
COLUMNS: REGION     | PRODUCT       | ACCOUNT
         ------------------------------------------
VALUES:  EU         | BOOKS         | NULL
         ------------------------------------------

productcategoriesまたはregioncategoriesで新しい行が作成されたときに、このように値が挿入されるようにします。

新しい行が作成されます。

         ---------------------------
TABLE:   PRODUCTCATEGORIES
         ---------------------------
COLUMNS: CODE       | DESCRIPTION
         ---------------------------
VALUES:  BOOKS      | Books
         ---------------------------
VALUES:  DVD        | DVDs
         ---------------------------

そして、SQL ステートメントが新しい値をマスターテーブルにコピーします。

         ------------------------------------------
TABLE:   MASTERTABLE
         ------------------------------------------
COLUMNS: REGION     | PRODUCT      | ACCOUNT
         ------------------------------------------
VALUES:  EU         | BOOKS        | NULL
         ------------------------------------------
VALUES:  EU         | DVD          | NULL
         ------------------------------------------

regioncategories に行が作成された場合も同様です。

新しい行。

         ---------------------------
TABLE:   REGIONCATEGORIES
         ---------------------------
COLUMNS: CODE       | DESCRIPTION
         ---------------------------
VALUES:  EU         | European Union
         ---------------------------
VALUES:  US         | United States
         ---------------------------

マスターテーブルにコピーされます。

         ------------------------------------------
TABLE:   MASTERTABLE
         ------------------------------------------
COLUMNS: REGION     | PRODUCT       | ACCOUNT
         ------------------------------------------
VALUES:  EU         | BOOKS         | NULL
         ------------------------------------------
VALUES:  EU         | DVD           | NULL
         ------------------------------------------
VALUES:  US         | BOOKS         | NULL
         ------------------------------------------
VALUES:  US         | DVD           | NULL
         ------------------------------------------

それが理にかなっていることを願っています。

ありがとう、

ステファン

4

4 に答える 4

2

実行時に「マスター テーブル」を簡単に作成できます。

SELECT  *
FROM    regiontable
CROSS JOIN
        producttable

マテリアライズドマスターテーブルとは異なり、両方のテーブルがおそらくキャッシュに収まるため、より効率的です。

何らかの理由でそれを具体化する必要がある場合は、両方のテーブルにトリガーを記述してください。

INSERT
INTO    mastertable
SELECT  r.code, NEW.code
FROM    regiontable t

mastertableおよび

INSERT
INTO    mastertable
SELECT  NEW.code, p.code
FROM    producttable p

オンproducttable

于 2010-04-04T09:54:03.763 に答える
1

マスターテーブルは、すべての潜在的な組み合わせの相互結合であるように見えます。したがって、新しいリージョンを追加するときは、そのリージョン内のすべての潜在的な製品を追加する必要があります。これは、すべての潜在的な地域とすべての潜在的なカテゴリから簡単に推測できるデータにとっては多大な労力です。

追加の列があるとおっしゃっていますね。これらの追加の列には何が含まれていますか?

私は通常、正規化されたデータベースでそのようなテーブルを具体化したままにしません-作成時に特別な方法で割り当ててから何らかのメンテナンスで変更する必要があるとほのめかしている追加の列がない限り、その場合でも、まばらなテーブル(つまり、適切なデフォルトを使用したデフォルトからの逸脱のみが適切に機能します。

私のシステムの1つに同様のクロス結合があり、約25mの行が含まれており、「行」と「列」がある2次元2500総勘定元帳x10000コストセンタースペースで非常に複雑なロジックを置き換えることができます。同一の論理でありながら、論理の「島」です。

于 2010-04-04T12:12:01.770 に答える
1

追加情報を MASTERTABLE に挿入するには、2 つの方法があります。

  1. トリガーを使用する - 挿入が PRODUCTCATEGORIES または REGIONCATEGORIES で発生すると、挿入トリガーが起動し、行が MASTERTABLE に存在するかどうかを確認します。そうでない場合は追加されます。

  2. PRODUCTCATEGORIES および REGIONCATEGORIES テーブルにデータを挿入するためのストアド プロシージャを作成します。ストアド プロシージャは、MASTERTABLE をチェックし、必要に応じて挿入します。

2 番目のアプローチには、他の誰かがあなたのコードを保守していて、何が起こっているのかが明らかであるという利点があります。トリガーは、重要な機能を隠すことができます。通常、ストアド プロシージャは、パフォーマンス上の理由から、Transact SQL に適しています。

于 2010-04-04T09:52:03.483 に答える
0

わかりました、あなたの答えと提案に感謝します。

MsSQL データベースに接続されたアクセス プロジェクトを使用しています。テーブルトリガーを使用してこれを解決しようとしましたが、どの提案もうまくいきませんでした。したがって、代わりに VBA コードを使用してクライアント側でこれを解決することにしました。

おそらくそれを解決する適切な方法ではありませんが、読んでいる人にとっては知っておくと役立つかもしれません.

テーブル構造は同じですが、製品テーブルと地域テーブルの両方に対応するフォームを作成しました。フォームの AfterInsert イベントには、次のコードがあります。

リージョン テーブル:

Private Sub Form_AfterInsert()

Dim varRegion As String
Dim strSQL As String

varRegion = Me![code]
strSQL = "INSERT INTO master([region], [product]) SELECT '" & varRegion & "', & _
          [code] FROM product;"

    DoCmd.RunSQL strSQL

End Sub

製品表:

Private Sub Form_AfterInsert()

Dim varProduct As String
Dim strSQL As String

varProduct = Me![code]
strSQL = "INSERT INTO master([region], [product]) SELECT [code], & _ 
          '" & varProduct & "' FROM region;"

    DoCmd.RunSQL strSQL

End Sub

編集:問題をもう少し調査したところ、クライアント側のセットアップを使用したくない場合、SQL Server を使用している場合、これがトリガーに使用する必要があるコードであることがわかりました。

どうやら、SQL Server では、挿入された行の値を取得するときに、"inserted" という隠しテーブルを参照する必要があるようです。詳細については、このリンクを表示してください: DML トリガーの複数行に関する考慮事項

すごい!

製品表:

-- Trigger statement
CREATE TRIGGER "name-of-trigger"
ON producttable
FOR INSERT AS

    -- Insert statement
INSERT INTO mastertable ([region],[product])
SELECT regiontable.[code], inserted.[code]
FROM regiontable, inserted;

リージョン テーブル:

-- Trigger statement
CREATE TRIGGER "name-of-trigger"
ON regiontable
FOR INSERT AS

    -- Insert statement
INSERT INTO mastertable ([product],[region])
SELECT producttable.[code], inserted.[code]
FROM producttable, inserted;
于 2010-04-05T11:55:31.123 に答える