需求大緻如下
表A可以通過導入表格來生成資料表C,然而表格中無主鍵,主鍵是導入表A後生成的。
現需要導入表B,找出表B和資料庫中表C的相同條,然後删掉
難點:
- 1.表B中無主鍵
- 2.表B中存在是以内容都相同的N條資料的可能,是以進行
select B.a,B.b,B.c
from B,C
where B.a=C.a
and B.b = C.b
and B.c = C.c;
表B
a | b | c |
1 | 2 | 3 |
1 | 2 | 3 |
表C
a | b | c |
1 | 2 | 3 |
1 | 2 | 3 |
這種查詢的時候會發生笛卡爾積的血案:
原本2條重複資料變成2*2=4條。
a | b | c |
1 | 2 | 3 |
1 | 2 | 3 |
1 | 2 | 3 |
1 | 2 | 3 |
如果這種問題在查詢部分,危害還不算大,問題是要進行删除操作,如果表C有3條,表B有2條,則原本使用者的想法是,想删掉2條,保留1條,目前這種方式,除了備援外,還會造成删除錯誤
解決思路
1.去重再select
B表去重後得到表D,再用D表與C笛卡爾積
select D.a,D.b,D.c
from D,C
where (select distinct a,b,c from B)D=C.a
and D.b = C.b
and D.c = C.c;
2.雙遊标拿張數
這裡講下思路:
B表拿第一行,C表拿第一行,首行相同,取最小行數到新的清單;
首行不同,擷取B第一行相同的行數,跳過前面N行;
繼續比較,直到C表到結尾;
如果B未到結尾,則B的剩餘行數不用考慮。