Выбор общих данных между двумя идентичными таблицами с тремя первичными ключами - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть две таблицы, скажем, table1 и table2. Они имеют одинаковые столбцы и первичные ключи и имеют одинаковое назначение. Кроме того, таблица2 новее, чем таблица1 и имеют более новые данные. Я хочу объединить их, но сначала мне придется удалить данные из таблицы table1, которые уже находятся в таблице table2.

Вот мой псевдокод:

Delete from table1 
where pk1, pk2, pk3 in (select pk1, pk2, pk3 from table2)

Это так же просто, как запрос:

Delete from table1 
where pk1 in (select pk1 from table2) 
  and pk2 in (select pk2 from table2) 
  and pk3 in (select pk3 from table2)

Например, в Table1 имеем:

pk1 | pk2 | pk3
000 | 001 | 001
000 | 002 | 001
000 | 002 | 002

Table2 у нас есть:

pk1 | pk2 | pk3
000 | 001 | 001
ABC | 002 | 001
ABC | 002 | 002

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

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Вместо удаления из Таблицы1 вы могли бы использовать LEFT JOIN вместо того, чтобы определить, какие строки не существуют в Таблице1, а затем вставить все новые данные одновременно, что приведет только к одному запросу, а не двум:

INSERT INTO Table1
SELECT Table2.* FROM Table2 LEFT JOIN Table1 
    ON Table2.pk1 = Table1.pk1 
    AND Table2.pk2 = Table1.pk2 
    AND Table2.pk3 = Table1.pk3
WHERE Table1.pk1 IS NULL 

Любые данные таблицы 1, которые не соответствуют всем требованиям, указанным в параметрах левого соединения, будут возвращены как NULL - поэтому в операторе WHERE необходим только один столбец pk.

РЕДАКТИРОВАТЬ: Поскольку вы хотите обновить новые значения в уже существующие строки, вы можете заменить WHERE Table1.pk1 IS NULL на следующее:

ON DUPLICATE KEY UPDATE Table1.X = Table2.X, Table1.Y = Table2.Y etc.

Предполагается, что к вашим трем значениям pk уже применен уникальный индекс (это должен быть ваш первичный ключ), а если нет, примените к своей таблице следующее:

ALTER TABLE Table1 
ADD CONSTRAINT pk_idx PRIMARY KEY (pk1, pk2, pk3);

Дайте мне знать, если вам нужно что-нибудь еще:)

0 голосов
/ 03 сентября 2018

Возможно, вы захотите использовать EXISTS:

DELETE T1
FROM Table1 T1
WHERE EXISTS (SELECT 1
              FROM Table2 T2
              WHERE T1.pk1 = T2.pk1
                AND T1.pk2 = T2.pk2
                AND T1.pk3 = T2.pk3);

Предоставленный вами SQL, вероятно, не будет работать так, как вы ожидаете. Например, если у вас есть следующие строки в Table1:

1,4,5
6,2,7
8,9,3

И следующий ряд в Table2:

1,2,3

Ни одна строка не будет удалена в Table1, поскольку все эти идентификаторы существуют в Table2.

...