Обновить запрос, чтобы получить новые записи без уникального ключа? - PullRequest
0 голосов
/ 09 марта 2012

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

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

Поскольку у меня нет уникального ключа, я не знаю, как это сделать. Есть идеи?

----- Редактировать из-за ответов -----

SourceTable
Field1   Field2   Field3

CopiedTable
Field1   Field2   Field3

Таким образом, чтобы обновить CopiedTable новыми записями, я бы сделал это ??

UPDATE CopiedTable SET 
       CopiedTable.Field1 = SourceTable.Field1,
       CopiedTable.Field2 = SourceTable.Field2,
       CopiedTable.Field3 = SourceTable.Field3
WHERE (SourceTable.Field1 <> CopiedTable.Field1 AND 
       SourceTable.Field2 <> CopiedTable.Field2 AND 
       SourceTable.Field3 <> CopiedTable.Field3)

1 Ответ

1 голос
/ 09 марта 2012

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

Используйте составной ключ, состоящий из всех полей уникальных ключей различных таблиц.


РЕДАКТИРОВАТЬ:

Каждая таблица должна иметь первичный ключ.Это основное правило проектирования баз данных.Предположим, что у вас есть две исходные таблицы A и B

Table A
-------
A_ID, DataField1, DataField2

Table B (lined to Table A through A_ID)
-------
B_ID, A_ID, DataField3, DataField4

Теперь вы можете создать таблицу C следующим образом

SELECT
    CLng(A.A_ID) AS A_ID, CLng(B.B_ID) AS B_ID,
    A.DataField1, A.DataField2, B.DataField3, B.DataField4
INTO
    C
FROM
    A INNER JOIN B ON A.A_ID = B.A_ID;

Я бы сделал A_ID и B_ID первичнымивведите C.

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

Если позжемы хотим пополнить C свежими данными из A и B, мы можем сделать

DELETE * FROM C;

INSERT INTO C
    (A_ID, B_ID, DataField1, DataField2, DataField3, DataField4)
SELECT
    A.A_ID, B.B_ID, A.DataField1, A.DataField2, B.DataField3, B.DataField4
FROM
    A INNER JOIN B ON A.A_ID = B.A_ID;

Если мы хотим обновить только измененные записи, нам нужно связать источник с копией и, кроме того, проверить,у нас есть изменения в предложении WHERE

UPDATE
    C
    INNER JOIN (SELECT
                  A.A_ID, B.B_ID,
                  A.DataField1, A.DataField2, B.DataField3, B.DataField4
                FROM
                  A INNER JOIN B ON A.A_ID = B.A_ID) AS Src
      ON C.B_ID = Src.B_ID AND C.A_ID = Src.A_ID
SET
    C.DataField1 = Src.DataField1,
    C.DataField2 = Src.DataField2,
    C.DataField3 = Src.DataField3,
    C.DataField4 = Src.DataField4
WHERE
    C.DataField1<>Src.DataField1 OR
    C.DataField2<>Src.DataField2 OR
    C.DataField3<>Src.DataField3 OR
    C.DataField4<>Src.DataField4;

Подвыбор Src может быть другим сохраненным запросом.

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