Sql 如何在多个列的表检查中避免重复

Sql 如何在多个列的表检查中避免重复,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想确保没有插入多个列的组合 比如说 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 我必须确保在向表中插入数据时不会重复任

我想确保没有插入多个列的组合

比如说

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 

在所有相关列上定义唯一键。然后DB将在插入重复项之前抛出一个错误。

确切的语法可能不匹配,但下面这一条可能是基本思路---


@库马尔:请在一个单独的链中找到这个问题的重复项

我有点不清楚您是第一次尝试在没有重复行的情况下填充一个表,还是希望创建一个将来不允许重复行的表(或者两者都不允许)。如果您想防止重复的行向前移动,那么@juergen的答案应该涵盖您。如果要首次使用一组不同的行填充表,请尝试以下查询:

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

如果你想同时做这两件事,那么@jurgen和我的答案的组合应该涵盖你。

如果在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

这就是我想要的:

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
)

欢迎提供更好的解决方案。

您能举一个例子说明上述数据的重复情况吗?假设已经存在1 2 3个组合,因此不允许使用相同的组合进行任何插入。您的问题是什么?
UNIQUE
PRIMARY KEY
约束可防止重复,您在下面提到您已经有一个约束,因此不清楚您的问题是什么。my select将通过应用多个联接返回多个记录,在这些选定的记录中,如果组合已存在于表中,则我希望忽略这些记录。请稍候,是否要将您的选择插入表中?我不一定确定您想要完成什么。我已经定义了唯一键,我只想在没有组合的情况下插入。然后在插入之前尝试插入并捕获错误或doa select。或者查看MSSQL
MERGE
这不是一个有用的答案,因为语法无效,并且代码的意图不明确。如果我多次运行该查询,则该查询应该可以工作。如果数据没有更改,则该查询应在每次运行时返回相同的数据。您测试过吗?上面的查询将返回不同的记录,这是可以的,但它不会限制用户重新提交重复的组合。您是否确实在Employee和BusesCategory中都有一个名为BusinessId的列?
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
)