B表的字段数量是大于并且包括了A表的所有字段的。
顺便问个问题 Merge Into NAME
这个MERGE 后面的跟的:
When Matched Then Update SET
When Not Matched By Target Then Insert values
只是 匹配的什么 和不匹配的什么哦
5 个解决方案
#1
A表与B表,有没有对应关系字段?
#2
可以用insert into A select 需要的字段 from B
merge的那个是说如果表里面有相匹配的字段值就update 否则insert一行新数据
merge的那个是说如果表里面有相匹配的字段值就update 否则insert一行新数据
#3
MSSQL2008R2新功能:
MERGE INTO dbo.T1 AS A --目标表
USING dbo.T1 AS B ON A.custid=B.custid --来源表,MERGE谓词
WHEN MATCHED THEN --当一个来源行与一个目标行匹配
UPDATE SET A.companyname=B.companyname, --根据来源行修改目标行
A.phone=B.phone,
A.[address]=B.[address]
WHEN NOT MATCHED THEN --当一个来源行找不到与之匹配的目标行
INSERT ( --添加到目标表
custid,
companyname,
phone,
[address],
inactive
)
VALUES (
B.custid,
B.companyname,
B.phone,
B.[address],
0
)
WHEN NOT MATCHED BY SOURCE THEN --当一个目标行找不到与之匹配的来源行
DELETE; --删除目标行
#4
USE tempdb;
GO
IF OBJECT_ID (N'Target', N'U') IS NOT NULL
DROP TABLE dbo.Target;
GO
Create table Target(ID int ,Name nvarchar(10))
insert into Target
values(1,'a'),(3,'b'),
(5,'c'),(10,'d')
GO
IF OBJECT_ID (N'dbo.Source', N'U') IS NOT NULL
DROP TABLE dbo.Source;
GO
Create table Source(ID int ,Name nvarchar(10))
insert into Source
values(2,'E'),(4,'F'),
(6,'H'),(10,'I')
/*Target--源表
ID Name
1 a
3 b
5 c
10 d
*/
/*Source--目标表
ID Name
2 E
4 F
6 H
10 I
*/
go
begin tran
merge Target as T
using Source as S
on (T.ID=S.ID)
when matched and T.Name<>S.Name --ID相同,Name不同时更新
then update set T.Name=S.Name
when not matched then --这里可不用写by Target(not matched by Target )没有的ID,新增
insert (ID,Name)values(S.ID,S.Name)
when not matched by source then --删除Target表在Source表没有的记录
delete
OUTPUT $action,
inserted.ID AS SourceID, inserted.Name AS SourceName,
deleted.ID AS TargetID, deleted.Name AS TargetName;
select * from Target
select * from Source
rollback tran
/*$action
$action SourceID SourceName TargetID TargetName
INSERT 2 E NULL NULL
INSERT 4 F NULL NULL
INSERT 6 H NULL NULL
DELETE NULL NULL 1 a
DELETE NULL NULL 3 b
DELETE NULL NULL 5 c
UPDATE 10 I 10 d
Target
ID Name
10 I
2 E
4 F
6 H
Source
ID Name
2 E
4 F
6 H
10 I
*/
go
SQL2008同Oracle的Merge用法比较
http://blog.csdn.net/roy_88/article/details/6942055
#5
A表其实就是B表的一个累积,因为查询昨天的需求更多,所以把这个独立出来。
第二天凌晨的时候,就会把B表的数据插入到A表中去,但是有些没用的字段就省略了撒。
上面我不明白的是: 为什么 会有UPDATE这样的事情出现呢? 为什么要更新呢? 删除了 重新插入不是更好咩?
第二天凌晨的时候,就会把B表的数据插入到A表中去,但是有些没用的字段就省略了撒。
上面我不明白的是: 为什么 会有UPDATE这样的事情出现呢? 为什么要更新呢? 删除了 重新插入不是更好咩?
#1
A表与B表,有没有对应关系字段?
#2
可以用insert into A select 需要的字段 from B
merge的那个是说如果表里面有相匹配的字段值就update 否则insert一行新数据
merge的那个是说如果表里面有相匹配的字段值就update 否则insert一行新数据
#3
MSSQL2008R2新功能:
MERGE INTO dbo.T1 AS A --目标表
USING dbo.T1 AS B ON A.custid=B.custid --来源表,MERGE谓词
WHEN MATCHED THEN --当一个来源行与一个目标行匹配
UPDATE SET A.companyname=B.companyname, --根据来源行修改目标行
A.phone=B.phone,
A.[address]=B.[address]
WHEN NOT MATCHED THEN --当一个来源行找不到与之匹配的目标行
INSERT ( --添加到目标表
custid,
companyname,
phone,
[address],
inactive
)
VALUES (
B.custid,
B.companyname,
B.phone,
B.[address],
0
)
WHEN NOT MATCHED BY SOURCE THEN --当一个目标行找不到与之匹配的来源行
DELETE; --删除目标行
#4
USE tempdb;
GO
IF OBJECT_ID (N'Target', N'U') IS NOT NULL
DROP TABLE dbo.Target;
GO
Create table Target(ID int ,Name nvarchar(10))
insert into Target
values(1,'a'),(3,'b'),
(5,'c'),(10,'d')
GO
IF OBJECT_ID (N'dbo.Source', N'U') IS NOT NULL
DROP TABLE dbo.Source;
GO
Create table Source(ID int ,Name nvarchar(10))
insert into Source
values(2,'E'),(4,'F'),
(6,'H'),(10,'I')
/*Target--源表
ID Name
1 a
3 b
5 c
10 d
*/
/*Source--目标表
ID Name
2 E
4 F
6 H
10 I
*/
go
begin tran
merge Target as T
using Source as S
on (T.ID=S.ID)
when matched and T.Name<>S.Name --ID相同,Name不同时更新
then update set T.Name=S.Name
when not matched then --这里可不用写by Target(not matched by Target )没有的ID,新增
insert (ID,Name)values(S.ID,S.Name)
when not matched by source then --删除Target表在Source表没有的记录
delete
OUTPUT $action,
inserted.ID AS SourceID, inserted.Name AS SourceName,
deleted.ID AS TargetID, deleted.Name AS TargetName;
select * from Target
select * from Source
rollback tran
/*$action
$action SourceID SourceName TargetID TargetName
INSERT 2 E NULL NULL
INSERT 4 F NULL NULL
INSERT 6 H NULL NULL
DELETE NULL NULL 1 a
DELETE NULL NULL 3 b
DELETE NULL NULL 5 c
UPDATE 10 I 10 d
Target
ID Name
10 I
2 E
4 F
6 H
Source
ID Name
2 E
4 F
6 H
10 I
*/
go
SQL2008同Oracle的Merge用法比较
http://blog.csdn.net/roy_88/article/details/6942055
#5
A表其实就是B表的一个累积,因为查询昨天的需求更多,所以把这个独立出来。
第二天凌晨的时候,就会把B表的数据插入到A表中去,但是有些没用的字段就省略了撒。
上面我不明白的是: 为什么 会有UPDATE这样的事情出现呢? 为什么要更新呢? 删除了 重新插入不是更好咩?
第二天凌晨的时候,就会把B表的数据插入到A表中去,但是有些没用的字段就省略了撒。
上面我不明白的是: 为什么 会有UPDATE这样的事情出现呢? 为什么要更新呢? 删除了 重新插入不是更好咩?