2012-11-29 37 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 
) 

歡迎任何更好的解決方案。