如何刪除數(shù)據(jù)庫重復(fù)字段且特定列為空的行
在關(guān)系型數(shù)據(jù)庫中,當(dāng)需要刪除具有特定字段重復(fù)但同時另一列值為 null 的行時,可以使用 sql 查詢。
考慮以下場景:
數(shù)據(jù)的datas表中存儲了以下信息:
credit | company | name | phone | id | pid |
---|---|---|---|---|---|
99284 | 傳媒有限公司 | 張三 | 3930 | 21d4f7 | NULL |
99284 | 傳媒有限公司 | 張三 | 3930 | 21d4f7 | 6ec897 |
99284 | 傳媒有限公司 | 王五 | 1895 | 2c6dcd | 21d4f7 |
99284 | 傳媒有限公司 | 王五 | 1895 | a8c70b | 21d4f7 |
99284 | 傳媒有限公司 | 李四 | 9894 | 33db09 | 21d4f7 |
99284 | 傳媒有限公司 | 李四 | 9894 | 703e16 | null |
99284 | 傳媒有限公司 | 李四 | 9894 | 0faa54 | 21d4f7 |
目標是刪除credit、company、name、phone和id字段相同但pid為空的行,而保留pid不為空的行。
解決方案:
DELETE FROM datas WHERE pid IS NULL AND (credit, company, name, phone, id, rootid) IN ( SELECT credit, company, name, phone, id, rootid FROM datas WHERE pid IS NOT NULL );
登錄后復(fù)制
此查詢使用以下步驟:
- 從datas表中選擇所有pid為空的行。
- 使用in子查詢從pid不為空的行中選擇credit、company、name、phone和id字段的組合。
- 刪除與子查詢中選擇的組合匹配的pid為空的行。
執(zhí)行此查詢將刪除以下行:
credit | company | name | phone | id | pid |
---|---|---|---|---|---|
99284 | 傳媒有限公司 | 李四 | 9894 | 703e16 | null |
保留以下行:
credit | company | name | phone | id | pid |
---|---|---|---|---|---|
99284 | 傳媒有限公司 | 張三 | 3930 | 21d4f7 | 6ec897 |
99284 | 傳媒有限公司 | 王五 | 1895 | 2c6dcd | 21d4f7 |
99284 | 傳媒有限公司 | 王五 | 1895 | a8c70b | 21d4f7 |
99284 | 傳媒有限公司 | 李四 | 9894 | 33db09 | 21d4f7 |
99284 | 傳媒有限公司 | 李四 | 9894 | 0faa54 | 21d4f7 |