【问题标题】:UPDATE FROM SELECT (correct duplicate values)UPDATE FROM SELECT(正确的重复值)
【发布时间】:2020-03-26 03:28:45
【问题描述】:

表 TEST 是错误的,因为它有重复的值。我需要使用唯一 id 更新关系表以进行测试,然后删除重复的值。

测试

+----------+---------+
| id_test  |  name   |
+----------+---------+
|    1     |   gir   |
|    2     |   gir   |  
|    3     |   gir   |
|    4     |   ego   |
|    5     |   ego   |
|    6     |   iph   |
|    7     |   iph   |
+----------+---------+

PRODUCT_HAS_TEST

+----------+---------+
| id_prod  | id_test |
+----------+---------+
|    3     |    1    |
|    1     |    2    |  
|    2     |    2    |
|    4     |    3    |
|    5     |    4    |
|    6     |    5    |
|    7     |    6    |
|    8     |    7    |
+----------+---------+

我有这个查询来查找重复值:

SELECT GROUP_CONCAT(id_test) as ids, name, COUNT(*) c FROM test GROUP BY name HAVING c > 1;

结果:

+------+------+------+
| ids  | name |   c  |
+------+------+------+
| 4,5  | ego  |   2  |
|1,2,3 | gir  |   3  |
| 6,7  | iph  |   2  |
+------+------+------+

另一个从 TEST 中删除重复值:

delete
from test using test,
    test e1
where test.id > e1.id
    and test.name = e1.name

但我需要先更新表 PRODUCT_HAS_TEST,我不知道该怎么做。

预期结果:

PRODUCT_HAS_TEST

+----------+---------+
| id_prod  | id_test |
+----------+---------+
|    3     |    1    |
|    1     |    1    |  
|    2     |    1    |
|    4     |    1    |
|    5     |    4    |
|    6     |    4    |
|    7     |    6    |
|    8     |    6    |
+----------+---------+

测试

+----------+---------+
| id_test  |  name   |
+----------+---------+
|    1     |   gir   |
|    4     |   ego   |
|    6     |   iph   |
+----------+---------+

【问题讨论】:

  • 您能告诉我们您希望这两个表在更新后的样子吗?
  • 当然!我已经更新了我的问题。

标签: mysql sql tsql


【解决方案1】:

当 id_test 重复时,您似乎想要 retain the min id_test 值,如果它是真的,那么您可以使用下面的 srcipt :

逻辑:
1. 使用 mysql update join 查询duplicate id_test mapping min_id_test 然后通过 min_id_test 更新 id_test
2.当id_test不是min_id_test时删除TEST表重复的id_test

CREATE TABLE TEST
  (`id_test` int, `name` varchar(3))
;

INSERT INTO TEST
  (`id_test`, `name`)
VALUES
  (1, 'gir'),(2, 'gir'),(3, 'gir'),(4, 'ego'),(5, 'ego'),(6, 'iph'),(7, 'iph');
✓ ✓
CREATE TABLE PRODUCT_HAS_TEST
  (`id_prod` int, `id_test` int)
;

INSERT INTO PRODUCT_HAS_TEST
  (`id_prod`, `id_test`)
VALUES
  (3, 1),(1, 2),(2, 2),(4, 3),(5, 4),(6, 5),(7, 6),(8, 7);
✓ ✓
UPDATE PRODUCT_HAS_TEST as T1
join (
  select T1.*,T2.id_test as new_id_test from TEST T1
  join (
      select min(id_test) id_test,name
      from TEST 
      where id_test is not null
      group by name
  ) T2 on T1.name = T2.name
  where T1.id_test <> T2.id_test
)T2 on T1.id_test = T2.id_test
set T1.id_test = T2.new_id_test
where T2.new_id_test is not null
;
DELETE FROM TEST as T 
where T.id_test not in (
    select * from (
        select distinct min(id_test) 
        from TEST 
        group by name
    ) T2
);
select * from PRODUCT_HAS_TEST;
id_prod | id_test ------: | ------: 3 | 1 1 | 1 2 | 1 4 | 1 5 | 4 6 | 4 7 | 6 8 | 6
select * from TEST;
id_test |姓名 ------: | :--- 1 |吉尔 4 |自我 6 | ip

db小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 2019-11-09
    • 2011-01-29
    • 2017-11-15
    • 2016-06-05
    • 2014-01-27
    • 2014-01-20
    相关资源
    最近更新 更多