如何删除数据库重复字段且特定列为空的行
在关系型数据库中,当需要删除具有特定字段重复但同时另一列值为 null 的行时,可以使用 sql 查询。
考虑以下场景:
数据的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 );
登录后复制
此查询使用以下步骤:
- 从datas表中选择所有pid为空的行。
- 使用in子查询从pid不为空的行中选择credit、company、name、phone和id字段的组合。
- 删除与子查询中选择的组合匹配的pid为空的行。
执行此查询将删除以下行:
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 |