Sql 合并两个表的内容而不复制内容

Sql 合并两个表的内容而不复制内容,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有两个相同的SQL Server表(SOURCE和DESTINATION),每个表中有很多列。我想在表目的地中插入表源中表目的地中不存在的行。如果除时间戳、计数列和整数主键外,所有列都匹配,则我定义两行之间的相等。因此,我想在DESTINATION中插入SOURCE中不存在于DESTINATION中的所有行,忽略计数、时间戳和主键列 我该怎么做 感谢所有的贡献!我选择使用Merge命令,因为它的结构允许在一条语句中进行更新和插入,并且我需要单独进行更新 这是有效的代码: Merge into

我有两个相同的SQL Server表(
SOURCE
DESTINATION
),每个表中有很多列。我想在表
目的地
中插入表
中表
目的地
中不存在的行。如果除时间戳、计数列和整数主键外,所有列都匹配,则我定义两行之间的相等。因此,我想在
DESTINATION
中插入
SOURCE
中不存在于
DESTINATION
中的所有行,忽略计数、时间戳和主键列

我该怎么做

感谢所有的贡献!我选择使用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

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
子句添加列。

为此使用
Select
语句,因为Sql Server 2008已过时,而不是
Select
您可以使用
Merge
语句:

参考:


使用良好的ol'-style
左连接的解决方案
——注意,在下面的示例中,只有BBB的第一行插入AAA,因为只有它在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)

MSSQL中不支持使用()。IIRC,这是MySQL的一个特性。但是我很喜欢你的join方法,它的语法没有相关子查询那么详细,但是更清晰。@richardtallent你能在MSSQL中使用ON()而不是()吗?回答得很好!我不知道MERGE,但我仍在使用2005(再过几周),我肯定会在将来使用它。我正在尝试如何使用它。文档中的示例要求您查看AAA表中的元素。我认为使用正确的选择应该避免这种情况。