SQL - копировать столбцы в новую таблицу - PullRequest
0 голосов
/ 13 марта 2020

У меня есть таблица:

Сообщение таблицы

+----+--------+-----------------------+
| id | postId |         path          |
+----+--------+-----------------------+
|  1 |     22 | Hello/World           |
|  2 |     23 | Hello/World/test      |
|  3 |     24 | Hello/World           |
|  4 |     25 | World/Monk            |
|  5 |     26 | Test/Test2            |
|  6 |     27 | Hello/World/test      |
|  7 |     28 | Hello/World/Something |
|  8 |     29 | Hello/World/Noa       |
|  9 |     30 | Hello/World           |
+----+--------+-----------------------+

id является первичным ключом. postId также уникален. path не уникален. Я хочу отношения, где есть отношения многие-к-одному с path и postId. Таким образом, один postId может иметь один путь, но один путь может иметь много postId.

Для этого я хочу создать новую таблицу (Table PostPathMap), которая выглядит следующим образом:

+----+--------+
| id | postId |
+----+--------+
| 22 |      1 |
| 23 |      2 |
| 24 |      3 |
| 25 |      4 |
| 26 |      5 |
| 27 |      6 |
| 28 |      7 |
| 29 |      8 |
| 30 |      9 |
+----+--------+

, где postId является первичным ключом. Затем я хочу удалить повторяющиеся записи, чтобы моя запись в таблице заканчивалась следующим образом:

+----+-----------------------+
| id |         path          |
+----+-----------------------+
|  1 | Hello/World           |
|  2 | Hello/World/test      |
|  4 | World/Monk            |
|  5 | Test/Test2            |
|  7 | Hello/World/Something |
|  8 | Hello/World/Noa       |
+----+-----------------------+

Поэтому мне нужно обновить PostPathMap. Как я могу обновить эту таблицу, не делая это вручную?

Ожидаемое PostPathmap после обновления:

+----+--------+
| id | postId |
+----+--------+
| 22 |      1 |
| 23 |      2 |
| 24 |      1 |
| 25 |      4 |
| 26 |      5 |
| 27 |      2 |
| 28 |      7 |
| 29 |      8 |
| 30 |      1 |
+----+--------+

1 Ответ

1 голос
/ 13 марта 2020

Создайте таблицу PostPathMap следующим образом:

CREATE TABLE PostPathMap AS
SELECT postId id, id postId FROM Post;

Обновите PostPathMap:

UPDATE PostPathMap ppm
INNER JOIN (
  SELECT path, MIN(id) id
  FROM Post
  GROUP BY path
) t ON t.id < ppm.postid
INNER JOIN Post p 
ON p.path = t.path AND p.id = ppm.postid
SET ppm.postid = t.id;

, а затем удалите дубликаты из Post с помощью самостоятельного объединения в UPDATE оператор:

DELETE p1 
FROM Post p1 INNER JOIN Post p2
ON p2.path = p1.path AND p2.id < p1.id;

См. Демоверсию .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...