2013-10-04 69 views
0

假设我有一个临时表#t包含包含完整行数的列(MyGroup,FSGRoup,Account,BrokerCode,AccountType,NewInvestmentType,AccountOrder,LPI,LPII,LPIII)。在插入之前比较几个列的值

我有另一个表#t2具有相同的布局,只有#t中包含的行的子集。如果列MyGroup,FSGRoup,Account,BrokerCode,AccountType,NewInvestmentType,AccountOrder没有匹配,我想插入#t中的行,而不是#t2中的行。

有什么建议吗?

回答

0

假设你是在SQL 2008+,这正是合并的命令是什么(除其他事项外)

一个不错的简单的说明使用合并退房this question - 有一点点搜索还有更多。 MS文档虽然有点混乱。

ADDED

搞砸了,这意味着包括this link太上合并基础知识好文章。

+0

前嗨加里,你指定的例子只检查一列。我需要检查多个列。 – Chessguru

+0

为什么不看看我之前添加的第二个链接 –

1

如果您不想按照以前的建议使用合并语句,则可以执行以下操作。第一个查询使用外部联接来获取#t中但不在#t2中的行,并将它们放入第三个临时表#t3中。第二个查询将它们从#t3放入#t2。

SELECT t.MyGroup, t.FSGRoup, t.Account, t.BrokerCode, t.AccountType, t.NewInvestmentType, t.AccountOrder, t.LPI, t.LPII, t.LPIII 
INTO #t3 
FROM #t t 
LEFT OUTER JOIN #t2 t2 
ON t.MyGroup = t2.MyGroup AND t.FSGRoup = t2.FSGRoup AND t.Account = t2.Account AND t.BrokerCode = t2.BrokerCode AND t.AccountType = t2.AccountType AND t.NewInvestmentType = t2.NewInvestmentType AND t.AccountOrder = t2.AccountOrder 
WHERE t2.MyGroup IS NULL 
/*Assuming that MyGroup can't be null. If it can, use a column that can't.*/ 

INSERT INTO #t2 
SELECT MyGroup, FSGRoup, Account, BrokerCode, AccountType, NewInvestmentType, AccountOrder, LPI, LPII, LPIII 
FROM #t3 
+0

我认为EXCEPT语句可以做到这一点。现在尝试。会及时向大家发布。 – Chessguru

+0

@Chessguru:EXCEPT可能适合你,但这一个似乎更符合你的要求。你不需要使用第三个表,只需要第一个SELECT,删除'INTO#t3',并用'INSERT INTO#2'作为前缀(最好也明确列出目标列,即'INSERT INTO#t2(MyGroup,...)SELECT ...')。 –

+0

这个陈述的作品! – Chessguru

0

合并是很好的解决方案,但是当有在一个单一的去做多操作,如插入,更新和删除的建议。 由于这里的要求是将数据插入到从#T#T2不属于#ta简单,除了会做

insert into #t2(
MyGroup, FSGRoup, Account, BrokerCode, AccountType, NewInvestmentType, AccountOrder, LPI, LPII, LPIII) 

select MyGroup, FSGRoup, Account, BrokerCode, AccountType, NewInvestmentType, AccountOrder, LPI, LPII, LPIII from #t 
except 
select MyGroup, FSGRoup, Account, BrokerCode, AccountType, NewInvestmentType, AccountOrder, LPI, LPII, LPIII from #t2 

这将更加高效,可靠,比其他两种解决方案,贴