我有两个表具有相同的结构但是另一个名称(在第一个表中我存储默认值,在第二个表中我存储了用户保存的值)。
我使用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)?或者也许有人有另一个想法。请帮忙。
感谢。
答案 0 :(得分:3)
如果我理解正确,您希望始终保留table_saved
的所有记录,以及table_default
中table_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)