Sql 合并两个表的内容而不复制内容
我有两个相同的SQL Server表(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
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表中的元素。我认为使用正确的选择应该避免这种情况。