2012-11-29 36 views
-2

我想确保没有插入多列的组合。如何避免表中的重复检查多列

可以说。

Emloyee 

EmployeeId CatgoryId BusinessId 

1   1   1 

2   2   1 


BusessCategory 

CategoryId BusinessId 

1   1 
1   2 
1   3 
2   1 
2   4 
2   3 

我必须确保在将数据插入表中时不会重复组合。

我的SQL查询将我一些东西一样

insert into employee(EmployeeId, CatgoryId, BusinessId) 
select e.employeeid,e.categoryid,bc.BusinessId from employee e inner join BusessCategory bc on bc.CatgoryId = e.CatgoryId 
+0

你能举一个例子说明上述数据会有什么重复吗? –

+0

可以说1 2 3组合已经存在,所以它不应该允许任何插入相同的组合。 – Brainchild

+0

你的问题到底是什么? 'UNIQUE'或'PRIMARY KEY'约束可以防止重复,并且您在下面提到您已经拥有一个,所以不清楚您的问题是什么。 – Pondlife

回答

2

定义了所有相关列的唯一关键。然后数据库将在插入重复项之前发生错误。

+0

我定义了唯一的密钥,我只想在没有组合的情况下插入。 – Brainchild

+0

然后尝试插入并捕获错误或在插入前进行选择。或者查看MSSQL MERGE –

-3

确切的语法可能不匹配,但是这一次下面可能是一个基本的想法---

  insert into table (A,B,C) values (a,b,c) where a is not in(select a from table where A=a and B=b and C=c) 
+0

这不是一个有用的答案,因为语法无效,代码的意图不明确 – Pondlife

0

我有点不清楚你是否试图第一次填充表而没有重复的行,或者如果你想创建一个不允许在未来(或可能两者)重复行的表。如果你想防止重复的行,那么@ juergen的答案应该覆盖你。如果你想填充表首次与一组不同的行尝试下面的查询:

INSERT INTO Table1 (A,B,C) 
SELECT DISTINCT A,B,C FROM TABLE2 

如果你想要做的两件事则@jurgen的组合,我的答案应该包括你。

0

如果在BusessCategory中重复bc.bc.CatgoryId,那么您将在每个匹配的结果中获得一行。

select e.employeeid,e.categoryid,bc.BusinessId 
from employee e 
inner join BusessCategory bc 
on bc.CatgoryId = e.CatgoryId 

最简单的答案是

select distinct e.employeeid,e.categoryid,bc.BusinessId 
from employee e 
inner join BusessCategory bc 
on bc.CatgoryId = e.CatgoryId 
+0

查询应该工作,如果我多次运行它。 – Brainchild

+0

如果数据没有改变,那么查询应该在每次运行时返回相同的数据。你测试过了吗? – Paparazzi

+0

上面的查询将返回不同的记录,但是它不会限制用户重新提交重复组合 – Brainchild

0

这就是我在寻找:

insert into employee(EmployeeId, CatgoryId, BusinessId) 
select e.employeeid,e.CatgoryId,bc.BusinessId from employee e inner join BusessCategory bc 
on bc.CategoryId = e.CatgoryId 
where not exists(
select * from employee e1 where 
bc.BusinessId = e1.BusinessId and e.CatgoryId = e1.CatgoryId and e.EmployeeId = e1.EmployeeId 
) 

欢迎任何更好的解决方案。