天天看點

程式實作無主鍵查詢删除

需求大緻如下

表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的剩餘行數不用考慮。

另一思路