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。或者查看MSSQLMERGE
这不是一个有用的答案,因为语法无效,并且代码的意图不明确。如果我多次运行该查询,则该查询应该可以工作。如果数据没有更改,则该查询应在每次运行时返回相同的数据。您测试过吗?上面的查询将返回不同的记录,这是可以的,但它不会限制用户重新提交重复的组合。您是否确实在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
)