SQL: Как мне вставить значения первичного ключа из двух таблиц в основную таблицу - PullRequest
2 голосов
/ 04 апреля 2010

Буду признателен за некоторую помощь с оператором SQL, который я действительно не могу понять.

То, что я хочу сделать, довольно просто, мне нужно взять значения из двух разных таблиц и скопировать их в основную таблицу, когда новая строка вставляется в одну из двух таблиц.

Возможно, проблему лучше всего объяснить следующим образом:

У меня есть три таблицы: товарные категории, региональные категории и мастер-таблица.

         ---------------------------
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
         ------------------------------------------

Я хочу, чтобы значения были вставлены следующим образом при создании новой строки в категориях товаров или регионах.

Новая строка создана.

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

И оператор SQL копирует новые значения в mastertable.

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

То же самое происходит, если в области регионов создается строка.

Новый ряд.

         ---------------------------
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
         ------------------------------------------

Надеюсь, это имеет смысл.

Спасибо

Stefan

Ответы [ 4 ]

2 голосов
/ 04 апреля 2010

Вы можете легко построить свою «главную таблицу» во время выполнения:

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.

1 голос
/ 04 апреля 2010

Ваша мастер-таблица является перекрестным соединением всех возможных комбинаций.Таким образом, когда вы добавляете новый регион, вам необходимо добавить все потенциальные продукты в этом регионе.Это много усилий для данных, которые могут быть просто выведены из всех потенциальных регионов и всех потенциальных категорий.

Я знаю, вы упоминаете, что есть дополнительные столбцы.Что содержат эти дополнительные столбцы?

Обычно я не буду хранить такую ​​таблицу материализованной в нормализованной базе данных - если только дополнительные столбцы, на которые вы ссылаетесь, должны быть назначены каким-то особым образом при создании, а затем изменены в некоторыхвид обслуживания - даже в этом случае разреженная таблица (то есть только отклонения от значений по умолчанию) с соответствующими значениями по умолчанию может хорошо работать.

У меня есть аналогичное перекрестное соединение в одной из моих систем, и оно содержит около 25 м.строк и позволяет нам заменить очень сложную логику на 2-мерную 2500 счетов главной книги x 10000 мест возникновения затрат, где есть «строки» и «столбцы» идентичной логики, но все же «островки» логики.

1 голос
/ 04 апреля 2010

Есть два способа вставить дополнительную информацию в MASTERTABLE.

  1. Использовать триггеры - когда вставка происходит в PRODUCTCATEGORIES или REGIONCATEGORIES, срабатывает триггер вставки и проверяется, существует ли строка в MASTERTABLE. Если не добавлено.

  2. Создайте хранимую процедуру для вставки данных в таблицу PRODUCTCATEGORIES и REGIONCATEGORIES. Затем хранимая процедура отвечает за проверку MASTERTABLE и вставку, если необходимо.

Преимущество второго подхода состоит в том, что для кого-то другого, поддерживающего ваш код, очевидно, что происходит. Триггеры могут скрывать важные функции. Хранимые процедуры обычно предпочтительнее для транзакционного SQL по соображениям производительности.

0 голосов
/ 05 апреля 2010

Хорошо, спасибо за ваши ответы и предложения.

Я работаю с проектом доступа, подключенным к базе данных 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 вам нужно ссылаться на скрытую таблицу с именем "вставлено", когда вы хотите получить значения вставленной строки. Для получения дополнительной информации перейдите по этой ссылке: Многострочные соображения для триггеров 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;
...