如何删除Products表中不存在的Categories表记录?
删除未在产品中引用的分类记录
针对你的需求,需要删除Categories表中那些未在Products表的Category字段(逗号分隔多值)中出现过的分类记录。下面分不同数据库给出对应的SQL语句:
MySQL
利用FIND_IN_SET函数直接匹配逗号分隔的分类集合:
DELETE c FROM Categories c WHERE NOT EXISTS ( SELECT 1 FROM Products p WHERE FIND_IN_SET(c.Name, p.Category) > 0 );
SQL Server
通过CHARINDEX加前后逗号实现精确匹配(避免部分匹配,比如把C11误判为C1):
DELETE FROM Categories c WHERE NOT EXISTS ( SELECT 1 FROM Products p WHERE CHARINDEX(',' + c.Name + ',', ',' + p.Category + ',') > 0 );
Oracle
用INSTR函数实现类似SQL Server的精确匹配逻辑:
DELETE FROM Categories c WHERE NOT EXISTS ( SELECT 1 FROM Products p WHERE INSTR(',' || p.Category || ',', ',' || c.Name || ',') > 0 );
补充说明
如果数据库支持表值函数(比如SQL Server的STRING_SPLIT),也可以先拆分Products的Category字段为独立行,再用NOT IN或NOT EXISTS匹配:
以SQL Server为例:
DELETE FROM Categories WHERE Name NOT IN ( SELECT DISTINCT value FROM Products CROSS APPLY STRING_SPLIT(Category, ',') );
这种方式逻辑更清晰,也避免了字符串匹配的潜在问题,推荐在支持的数据库中使用。
内容的提问来源于stack exchange,提问作者Rahul Parab
相关产品推荐
相关产品推荐

