Загрузка данных из одной таблицы в две другие таблицы (одна деталь, одна сводка), которые связаны между собой - PullRequest
0 голосов
/ 26 января 2010

Предположим, у меня есть исходная таблица, подобная этой:

Source
    SourceKey (PK)
    Data1
    Data2
    Amount

И я загружаю данные из 'Source' в две связанные таблицы, которые выглядят так:

Summary
    SummaryKey (PK)
    Data1
    Data2
    Amount

Detail
    DetailKey (PK)
    SummaryKey (FK)
    SourceKey (FK)
    Data2
    Amount

EDIT

Игнорируя проблему соотнесения «Summary» и «Detail», идеальные операторы вставки выглядят так:

INSERT INTO Summary (Data1, Data2, Amount)
SELECT Data1, Data2, SUM(Amount) FROM Source GROUP BY Data1, Data2

INSERT INTO Detail (SummaryKey, SourceKey, Data2, Amount)
SELECT ???, SourceKey, Data2, Amount FROM Source

Я «решил» эту проблему с помощью пары таблиц временного хранения (соответствующих таблицам назначения) вместе с полусложным оператором UPDATE, чтобы связать их путем сопоставления по группирующим полям ( real ). пример имеет гораздо более сложную группировку). Я не могу помочь, но чувствую, что существует более простое решение, чем то, что я создал.

Любое решение должно работать в SQL Server 2000. Спасибо за любые идеи.

Ответы [ 4 ]

2 голосов
/ 26 января 2010

Так как ваш дизайн оставляет желать лучшего, но неизменен. Я думаю, что лучший подход - это использовать курсор (парень, которого я ненавижу предлагать).

Перетащите источник в промежуточную таблицу, в которой есть дополнительный столбец SummaryKey, который останется пустым, и ключ идентификации с именем StagingKey. Используя курсор, вставляйте записи по одной в сводку. После каждой вставки извлекайте значение scope_identity () и обновляйте запись с помощью промежуточного ключа, который вы только что вставили, чтобы поместить это значение в промежуточную таблицу. После того, как все сделано, у вас должно быть все, что вам нужно вставить в таблицу сведений за одну вставку, а не курсор.

В более новых версиях SQL Server вы можете использовать предложение output и использовать вставку на основе набора для первой таблицы.

0 голосов
/ 26 января 2010

Я думал о том, как решить эту проблему с помощью SCOPE_IDENTITY() или @@IDENTITY, без триггеров, где это возможно, но потом меня поразило - где вообще необходимость таблицы Summary?

Не может ли он быть заменен видом, который в этом примере будет иметь вид SELECT Data1, Data2, SUM(amount) FROM Detail GROUP BY Data1, Data2? (Очевидно, что в вашем конкретном примере таблица подробностей не имеет поля Data1, но я использовал для этого поэтическую лицензию!)

0 голосов
/ 26 января 2010

Какова цель сделать это? Если вы просто делаете это из соображений производительности, похоже, это может быть хорошим кандидатом для индексированного представления.

0 голосов
/ 26 января 2010

Используйте triggers для создания строки, когда вставка выполняется в сводной таблице, во второй таблице. Это позволит вам исправить внешние ключи одним выстрелом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...