mysql 數據去重各種查詢總結

方式1:查出重複數據(保留的一條不查出,下面是保留了id最小的那條沒顯示)

# project_code 重複認爲數據重複
SELECT
	*
FROM
	pmp_project_collection a
WHERE
	EXISTS (
		SELECT
			1
		FROM
			pmp_project_collection b
		WHERE
			 a.id > b.id
		AND a.project_code = b.project_code
	);

 

方式2:查詢有重複記錄的 數據

SELECT
     *
FROM
     pmp_project_collection  a 
WHERE
     (
          SELECT
               count(1)
          FROM
               pmp_project_collection b
          where a.project_code = b.project_code 
     )>1;
SELECT
     *
FROM
     pmp_project_collection 
WHERE
     project_code IN (
          SELECT
               project_code
          FROM
               pmp_project_collection
          GROUP BY
               dealer_customer_code,
               customer_name
          HAVING
               count(*) > 1
     )

 

 方式3:查詢不帶重複數據的記錄(當重複時查詢出的是id 最小的那一條數據)

SELECT
     *
FROM
     pmp_project_collection  a 
WHERE
     (
          SELECT
               count(1)
          FROM
               pmp_project_collection b
          where a.project_code = b.project_code and a.id<b.id
     )<1;

 

 方式4:數據表中數據去重(需要mysql 版本支持)

# 爲認爲重複字段值重複數據就重複得字段加唯一索引,原來是新建一張一樣得表並且此字段加有唯一索引,然後從原來得表copy 數據到這個新表,重複數據忽略(用得是insert ignore ....語句插入得)。

ALTER IGNORE TABLE pmp_project_collection 
ADD UNIQUE INDEX idx_project_code (project_code);

方式5:

#原理上是從需要刪除得裏面忽略需要保留得 數據

DELETE
FROM
    pmp_project_collection
WHERE
    project_code IN
    (
        SELECT
            t1.project_code
        FROM
            (
                SELECT
                    project_code
                FROM
                    tr_dealer_customer_relation
                GROUP BY
                    project_code
                HAVING
                    count(*) > 1
            )
            AS t1
    )
    AND id NOT IN
    (
        SELECT
            t2.id
        FROM
            (
                SELECT
                    max(id)
                FROM
                    tr_dealer_customer_relation
                GROUP BY
                    project_code
                HAVING
                    count(*) > 1
            )
            AS t2
    )
;

 方式6:從b表中取數據更新到a表字段中

UPDATE  table_a a, table_b b
SET a.domain_code = b.domain_code,
a.domain_name = b.domain_name,
a.child_domain_code = b.child_domain_code,
a.child_domain_name = b.child_domain_name
WHERE
     a.commodity_cid = b.commodity_cid
AND a.commodity_code != b.commodity_code;

 方式7:a 表 a字段更新到a表b字段

UPDATE pln_config_item a
SET a.parent_item_key = (select id  from(
	SELECT
		id,item_key
	FROM
		pln_config_item b
	WHERE
		(
			b.parent_item_key = ''
			OR b.parent_item_key IS NULL
		)
	AND b.category_key = 'fillInstruction'
) n where  n.item_key = a.parent_item_key)
WHERE
	a.category_key = 'fillInstruction'
AND 
	a.parent_item_key != ''
	and a.parent_item_key IS NOT NULL
;

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章