waterfy

数据表

SUPPLIER_ID COM_ID SUPPLIER_NAME OWNER_ID
1092002 1002001 上海飞科 3
1092003 1002001 上海飞科 3
9824001 28005 绍兴11 2
9824002 28005 绍兴11 2
9824003 28005 绍兴11 2
9824004 28006 绍兴12 2
1.查询重复记录(COM_ID,SUPPLIER_NAME,OWNER_ID)
SELECT
	*
FROM
	supplier_info
WHERE
	(
		COM_ID,
		owner_id,
		SUPPLIER_NAME
	) IN (
		SELECT
			COM_ID,
			owner_id,
			SUPPLIER_NAME
		FROM
			supplier_info
		GROUP BY
			COM_ID,
			owner_id,
			SUPPLIER_NAME
		HAVING
			count(1) > 1
	)

结果

SUPPLIER_ID COM_ID SUPPLIER_NAME OWNER_ID
1092002 1002001 上海飞科 3
1092003 1002001 上海飞科 3
9824001 28005 绍兴11 2
9824002 28005 绍兴11 2
9824003 28005 绍兴11 2
2.删除重复记录(保留一条)
  • 思路:先查询出要删除的记录id,然后删除。
  1. 查找需要删除的记录,重复记录里面id不在group_by里面的
SELECT
	*
FROM
	supplier_info
WHERE
	(
		COM_ID,
		owner_id,
		SUPPLIER_NAME
	) IN (
		SELECT
			COM_ID,
			owner_id,
			SUPPLIER_NAME
		FROM
			supplier_info
		GROUP BY
			COM_ID,
			owner_id,
			SUPPLIER_NAME
		HAVING
			count(1) > 1
	)
AND SUPPLIER_ID NOT IN (
	SELECT
		SUPPLIER_ID
	FROM
		supplier_info
	GROUP BY
		COM_ID,
		owner_id,
		SUPPLIER_NAME
	HAVING
		count(1) > 1
)

结果

SUPPLIER_ID COM_ID SUPPLIER_NAME OWNER_ID
1092003 1002001 上海飞科 3
9824002 28005 绍兴11 2
9824003 28005 绍兴11 2
  1. 删除这些id的数据
DELETE
FROM
	supplier_info
WHERE
	supplier_id IN (
		SELECT
			SUPPLIER_ID
		FROM
			supplier_info
		WHERE
			(
				COM_ID,
				owner_id,
				SUPPLIER_NAME
			) IN (
				SELECT
					COM_ID,
					owner_id,
					SUPPLIER_NAME
				FROM
					supplier_info
				GROUP BY
					COM_ID,
					owner_id,
					SUPPLIER_NAME
				HAVING
					count(1) > 1
			)
		AND SUPPLIER_ID NOT IN (
			SELECT
				SUPPLIER_ID
			FROM
				supplier_info
			GROUP BY
				COM_ID,
				owner_id,
				SUPPLIER_NAME
			HAVING
				count(1) > 1
		)
	)

结果
image
查找原因发现是因为mysql不能用查询出来的数据去更新,解决方式将查询嵌套一层

DELETE
FROM
	supplier_info
WHERE
	supplier_id IN (
		SELECT
			supplier_id
		FROM
			(
				SELECT
					SUPPLIER_ID
				FROM
					supplier_info
				WHERE
					(
						COM_ID,
						owner_id,
						SUPPLIER_NAME
					) IN (
						SELECT
							COM_ID,
							owner_id,
							SUPPLIER_NAME
						FROM
							supplier_info
						GROUP BY
							COM_ID,
							owner_id,
							SUPPLIER_NAME
						HAVING
							count(1) > 1
					)
				AND SUPPLIER_ID NOT IN (
					SELECT
						SUPPLIER_ID
					FROM
						supplier_info
					GROUP BY
						COM_ID,
						owner_id,
						SUPPLIER_NAME
					HAVING
						count(1) > 1
				)
			) a
	)

删除成功结果

SUPPLIER_ID COM_ID SUPPLIER_NAME OWNER_ID
1092002 1002001 上海飞科 3
9824001 28005 绍兴11 2
9824004 28006 绍兴12 2

分类:

技术点:

相关文章: