объединение содержимого двух таблиц без дублирования содержимого - PullRequest
7 голосов
/ 17 марта 2012

У меня есть две идентичные таблицы SQL Server (SOURCE и DESTINATION) с множеством столбцов в каждой.Я хочу вставить в таблицу DESTINATION строки из таблицы SOURCE, которых еще нет в таблице DESTINATION.Я определяю равенство между двумя строками, если совпадают все столбцы, кроме метки времени, столбца count и целочисленного первичного ключа.Поэтому я хочу вставить в DESTINATION все строки в SOURCE, которые еще не существуют в DESTINATION, игнорируя столбцы count, timestamp и первичного ключа.

Как мне это сделать?

Спасибо за все вклады!Я решил использовать команду Merge, поскольку она структурирована так, чтобы разрешать обновления и вставки в одном операторе, и мне нужно было выполнить обновление отдельно.

это код, который работал:

Merge 
into DESTINATION as D
using  SOURCE as S
on (    
D.Col1 = S.Col1
and D.Col2 = S.Col2
and D.Col3 = S.Col3
)
WHEN MATCHED
 THEN UPDATE SET D.Count = S.Count
 WHEN NOT MATCHED THEN  
        INSERT (Col1, Col2, Col3, Count, timestamp)
        VALUES (S.Col1, S.Col2, S.Col3, S.Count, S.timestamp);

примечание: когда я впервые написал этот вопрос, я назвал таблицы AAA и BBB.Я отредактировал и изменил имена AAA на SOURCE И BBB на DESTINATION для ясности

Ответы [ 3 ]

5 голосов
/ 17 марта 2012

с помощью оператора Select для этой цели, поскольку Sql Server 2008 устарел вместо Select Вы можете использовать оператор Merge:

исй:

http://technet.microsoft.com/en-us/library/bb510625.aspx http://weblogs.sqlteam.com/peterl/archive/2007/09/20/Example-of-MERGE-in-SQL-Server-2008.aspx

5 голосов
/ 17 марта 2012

Примерно так:

INSERT INTO BBB(id, timestamp, mycount, col1, col2, col3, etc.)
SELECT id, timestamp, mycount, col1, col2, col3, etc.
   FROM AAA
   WHERE
       NOT EXISTS(SELECT NULL FROM BBB oldb WHERE
          oldb.col1 = AAA.col1
          AND oldb.col2 = AAA.col2
          AND oldb.col3 = AAA.col3
       )

Добавьте столбцы по мере необходимости к предложению NOT EXISTS.

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

Решение с использованием старого доброго стиля LEFT JOIN - обратите внимание, что в приведенном ниже примере в AAA вставляется только первая строка BBB, поскольку только у нее нет соответствующей строки в AAA. Вы бы заменили col1 и col2 фактическими столбцами таблиц.

> select * from AAA;
+---------------------+------+------+
| timestamp           | col1 | col2 |
+---------------------+------+------+
| 2012-03-17 08:17:22 |    1 |    1 |
| 2012-03-17 08:17:27 |    1 |    2 |
| 2012-03-17 08:17:30 |    1 |    3 |
| 2012-03-17 08:17:32 |    1 |    4 |
| 2012-03-17 08:17:49 |    2 |    2 |
| 2012-03-17 08:17:52 |    2 |    3 |
| 2012-03-17 08:17:54 |    2 |    4 |
+---------------------+------+------+
7 rows in set (0.00 sec)

> select * from BBB;
+---------------------+------+------+
| timestamp           | col1 | col2 |
+---------------------+------+------+
| 2012-03-17 08:18:16 |    2 |    1 |
| 2012-03-17 08:18:18 |    2 |    2 |
| 2012-03-17 08:18:20 |    2 |    3 |
+---------------------+------+------+
3 rows in set (0.00 sec)

> INSERT INTO AAA
  SELECT BBB.* FROM BBB
  LEFT JOIN AAA
  USING(col1,col2)
  WHERE AAA.timestamp IS NULL;

> select * from AAA;
+---------------------+------+------+
| timestamp           | col1 | col2 |
+---------------------+------+------+
| 2012-03-17 08:17:22 |    1 |    1 |
| 2012-03-17 08:17:27 |    1 |    2 |
| 2012-03-17 08:17:30 |    1 |    3 |
| 2012-03-17 08:17:32 |    1 |    4 |
| 2012-03-17 08:17:49 |    2 |    2 |
| 2012-03-17 08:17:52 |    2 |    3 |
| 2012-03-17 08:17:54 |    2 |    4 |
| 2012-03-17 08:18:16 |    2 |    1 |
+---------------------+------+------+
8 rows in set (0.00 sec)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...