2016-01-20 30 views
1

我有一個奇怪的情況。我試圖遞歸地向SQL表中添加記錄。在將記錄添加到SQL表時檢測重複項

表結構(簡體):

TableA 
Key1 Key2 Description 

假設我已經有一些記錄更新表A:

Key1 Key2 Description 
12345 98765 Name1 
23456 87654 Name2 
34567 76543 Name3 
45678 65432 Name4 

我需要抓住的密鑰2的所有記錄現在和另一個表看看他們( TableB),但是如果Key1和Key2的組合已經存在,我不需要更新TableA。 因此,舉例來說,如果我在表B找到一個記錄鍵2 = 87654和鍵1 = 15965,我應該作如下更新表A:

Key1 Key2 Description 
87654 15965 Name59 

但如果我發現TableB中的記錄與鍵2 = 87654和鍵1 = 23456,我應在表A創建記錄所有:

Key1 Key2 Description 
87654 23456 Name59 

上述記錄應當創建。

這裏是我的查詢:

insert into TableA 
(key1, key2, Description) 
select Key1, Key2, Description from TableB 
join TableB TableB.Key1 = TableA.key2 
and TableB.Key2 <> TableA.Key1 
and not exists(select 1 from TableA where TableA.Key2= TableB.Key1and TableA.Key1 = TableB.Key2) 

這實際上插入重複所以在最後,這是我所得到的:

Key1 Key2 Description 
12345 98765 Name1 
23456 87654 Name2 
34567 76543 Name3 
45678 65432 Name4 
76543 74185 Name5 
87654 82563 Name6 
87654 23456 Name7 
76543 34567 Name8 
65432 45678 Name9 

我試圖避免將最後的3條記錄。 任何人有一個想法我做錯了什麼?

編輯:只是爲了澄清...這是我的數據集:

Key1         Key2 
E7483934-9AF7-E111-9912-78E7D16510D0 8FDE361D-B5C6-E011-A943-78E7D1644F78 
E7483934-9AF7-E111-9912-78E7D16510D0 5001D99D-966B-E111-8FD2-78E7D16510D0 
E7483934-9AF7-E111-9912-78E7D16510D0 76E8758E-A366-E111-B7C5-78E7D16510D0 
E7483934-9AF7-E111-9912-78E7D16510D0 FB6F054F-E2BE-E511-9410-005056B5201F 
E7483934-9AF7-E111-9912-78E7D16510D0 4A2007DA-E2BE-E511-9410-005056B5201F 
E7483934-9AF7-E111-9912-78E7D16510D0 AE90299F-FAF5-E211-8706-D8D385B829F8 
E7483934-9AF7-E111-9912-78E7D16510D0 76E9758E-A366-E111-B7C5-78E7D16510D0 
E7483934-9AF7-E111-9912-78E7D16510D0 EB483934-9AF7-E111-9912-78E7D16510D0 
8FDE361D-B5C6-E011-A943-78E7D1644F78 AE90299F-FAF5-E211-8706-D8D385B829F8 
8FDE361D-B5C6-E011-A943-78E7D1644F78 EB483934-9AF7-E111-9912-78E7D16510D0 
8FDE361D-B5C6-E011-A943-78E7D1644F78 76E9758E-A366-E111-B7C5-78E7D16510D0 


AE90299F-FAF5-E211-8706-D8D385B829F8 8FDE361D-B5C6-E011-A943-78E7D1644F78 
76E9758E-A366-E111-B7C5-78E7D16510D0 8FDE361D-B5C6-E011-A943-78E7D1644F78 
EB483934-9AF7-E111-9912-78E7D16510D0 8FDE361D-B5C6-E011-A943-78E7D1644F78 

所以頂部是表B(我的源表)。 我需要通過特定的Key1值查找此表(例如WHERE TableB.key1 ='E7483934-9AF7-E111-9912-78E7D16510D0'),將具有該值的記錄拉入另一個表(TableA),然後再次查找TableB但通過TableB.key1 = TableA.key2,如果存在記錄,則將它們添加到TableA表中。需要注意的是我不希望TableA具有key1 + key2的相同組合。所以如果你看看上面的例子,我只希望前面的11條記錄被拉入TableA中,但是它還會抽取最後3個我不需要的記錄,因爲這些組合已經存在於TableA中。

TIA, 
-Tony. 
+0

我想也許你在你的問題中混合了'key1'和'key2'。在你的問題的某些部分,'key1'和'key2'的值交換。這是打算? –

+0

因此,打算首先將TableB中具有特定key1值的所有記錄拖入臨時表(例如)TableA,然後讀取key2值上的TableA,再次在TableB中查找它們,但是通過TableB.key1 = TableA.key2和如果找到,則向TableA添加更多記錄,但我需要排除TableA上存在TableA的記錄.key1 = TableB.key2和TableA.key2 = TableA.key1。 – Tony

回答

1

您可以使用join子句中的條件來不插入不需要的記錄。

insert into TableA 
(key1, key2, Description) 
select b.key1, b.key2, b.description 
from TableB b 
join TableA a on (b.key1 <> a.key1 and b.key1 <> a.key2) 
       or (b.key2 <> a.key1 and b.key2 <> a.key2) 
+0

那麼,我需要根據特定的條件加入TableB(TableB.key1 = TableA.key2) – Tony

0

不要使用連接,或者只用它們來否定要插入的記錄。

當使用連接時,數據庫將從TableB中獲取所有記錄,並與TableA的每條記錄進行比較,如果有一個記錄對其進行驗證,它將通過。舉例來說,不需要的行可以通過表A的第一行進行驗證(例如,在您的示例中,您甚至可以使用TableB連接TableB ...我假設加入的是TableA)。

不使用符根據您的查詢:

insert into TableA 
(key1, key2, Description) 
select Key1, Key2, Description from TableB as B 
where not exists(select 1 from TableA as A where A.Key2=B.Key1 and A.Key1=B.Key2) 

或者用加入到否定/阻止不需要的行:

insert into TableA 
(Key1, Key2, Description) 
select distinct B.Key1, B.Key2, B.Description 
from TableB as B 
left outer join TableA as A on A.Key2=B.Key1 and A.Key1=B.Key2 
where A.Key1 is null 

考慮到可能鍵1不能爲空。還可以使用distinct來防止複製與多行匹配的記錄。