报错
t
delete from 产品表
where (产品名称, 品牌, 型号, 规格) in (select 产品名称,品牌,型号,规格 from 产品表 group BY 产品名称,品牌,型号,规格 having count(*) > 1)
报错
t
delete from 产品表
where (产品名称, 品牌, 型号, 规格) in (select 产品名称,品牌,型号,规格 from 产品表 group BY 产品名称,品牌,型号,规格 having count(*) > 1)
引自免费微信小程序:皆我百晓生
在 SQL 中,当使用 WHERE
子句的条件表达式时,通常需要确保表达式的值能够被解释为布尔类型(即真或假)。在您提供的示例中,您尝试在一个多列子查询的结果集中进行匹配删除重复记录。但是,这里的 (产品名称, 品牌, 型号, 规格)
被用作一个整体来判断是否存在于子查询结果中,虽然这个语法在某些数据库系统中可能是允许的(如 PostgreSQL 的数组比较),但在标准 SQL 或大部分数据库系统中并不直接支持。
问题分析:
您的意图是删除那些在(产品名称, 品牌, 型号, 规格)
组合上有重复记录的产品表中的行。但错误在于直接将这四列作为一个整体与子查询结果做 IN
比较。
正确解决方案: 为了实现这个目的,可以采用临时表、JOIN 或 EXISTS 子查询的方式来删除重复项。这里是一个使用 EXISTS 子查询的例子:
DELETE FROM 产品表 t1
WHERE EXISTS (
SELECT 1
FROM 产品表 t2
WHERE t1.产品名称 = t2.产品名称
AND t1.品牌 = t2.品牌
AND t1.型号 = t2.型号
AND t1.规格 = t2.规格
GROUP BY t2.产品名称, t2.品牌, t2.型号, t2.规格
HAVING COUNT(*) > 1
)
AND t1.主键字段 NOT IN (
SELECT MIN(主键字段)
FROM 产品表
GROUP BY 产品名称, 品牌, 型号, 规格
)
这段代码首先检查每个行是否存在至少一个具有相同 (产品名称, 品牌, 型号, 规格)
组合的行,然后排除每个组中的第一条记录(通过选择每个组的最小主键字段值),这样就可以删除除每组第一个之外的所有重复记录。
请务必替换 主键字段
为您实际的数据表中的主键字段名,并根据实际数据库系统的 SQL 语法特点进行调整。