MySQL - 选择值并按表名删除重复项

时间:2018-03-17 08:07:33

标签: mysql duplicates

我有两个表具有相同的结构但是另一个名称(在第一个表中我存储默认值,在第二个表中我存储了用户保存的值)。

我使用union all选择这些值:

SELECT * FROM `table_default` UNION ALL SELECT * FROM `table_saved`

table_default的结构:

| ID | SOME_VAL |
|  1 | def_val  |
|  2 | def_val  |
|  3 | def_val  |

table_saved的结构:

| ID | SOME_VAL |
|  1 |   test   |
|  3 |   text   |

现在,当我使用此查询时:

SELECT * FROM `table_default` UNION ALL SELECT * FROM `table_saved`

我得到了:

| ID | SOME_VAL |
|  1 | def_val  |
|  2 | def_val  |
|  3 | def_val  |
|  1 |   test   |
|  3 |   text   |

但我希望通过ID获取唯一值。 Table_saved更重要,所以当选择返回重复项时,我想从table_default中删除始终记录。 所以最后我想得到:

| ID | SOME_VAL |
|  2 | def_val  | --> from TABLE_DEFAULT because this record (by ID) is not exist in table_saved
|  1 |   test   | --> from TABLE_SAVED
|  3 |   text   | --> from TABLE_SAVED

我不能使用GROUP BY id,因为我不知道哪个记录会被删除(有时GROUP BY从table_default删除重复但有时GROUP BY也从table_saved中删除重复项)所以我无法管理此

是否可以使用表名和行名删除重复项(如GROUP BY)?或者也许有人有另一个想法。请帮忙。

感谢。

2 个答案:

答案 0 :(得分:3)

如果我理解正确,您希望始终保留table_saved的所有记录,以及table_defaulttable_saved中未显示ID的记录。一种方法是使用左连接来查找table_default的唯一记录。然后将其与table_saved的所有记录结合起来。

SELECT t1.ID, t1.SOME_VAL
FROM table_default t1
LEFT JOIN table_saved t2
    ON t1.ID = t2.ID
WHERE t2.ID IS NULL
UNION ALL
SELECT ID, SOME_VAL
FROM table_saved;

答案 1 :(得分:0)

如果始终存在默认值,您可以使用LEFT JOIN和COALESCE:

SELECT d.ID, COALESCE(s.SOME_VAL, d.SOME_VAL) AS SOME_VAL
FROM table_default d
LEFT JOIN table_saved s USING(ID)