Il existe plusieurs façons de résoudre le problème.
Comme d'autres l'ont mentionné, la méthode la plus simple consiste à ajouter temporairement une colonne reminder_id
au dateset
. Remplissez-le avec les IDs
d'origine de reminder
table. Utilisez-le pour rejoindre reminder
avec le dateset
table. Supprimez la colonne temporaire.
Si les valeurs du start
colonne est unique il est possible de le faire sans colonne supplémentaire en joignant reminder
table avec le dateset
table sur le start
colonne.
INSERT INTO dateset (start)
SELECT start FROM reminder;
WITH
CTE_Joined
AS
(
SELECT
reminder.id AS reminder_id
,reminder.dateset_id AS old_dateset_id
,dateset.id AS new_dateset_id
FROM
reminder
INNER JOIN dateset ON dateset.start = reminder.start
)
UPDATE CTE_Joined
SET old_dateset_id = new_dateset_id
;
Il est possible de le faire sans colonne temporaire même dans ce cas. L'idée principale est la suivante. Examinons cet exemple :
Nous avons deux lignes dans reminder
avec le même start
valeur et identifiants 3 et 7 :
reminder
id start dateset_id
3 2015-01-01 NULL
7 2015-01-01 NULL
Après les avoir insérés dans le dateset
, de nouveaux identifiants seront générés, par exemple, 1 et 2 :
dateset
id start
1 2015-01-01
2 2015-01-01
Peu importe comment nous relions ces deux lignes. Le résultat final pourrait être
reminder
id start dateset_id
3 2015-01-01 1
7 2015-01-01 2
ou
reminder
id start dateset_id
3 2015-01-01 2
7 2015-01-01 1
Ces deux variantes sont correctes. Ce qui nous amène à la solution suivante.
Insérez simplement toutes les lignes en premier.
INSERT INTO dateset (start)
SELECT start FROM reminder;
Faire correspondre/joindre deux tables sur start
colonne sachant qu'elle n'est pas unique. "Rendez-le" unique en ajoutant ROW_NUMBER
et joint par deux colonnes. Il est possible de raccourcir la requête, mais j'ai expliqué chaque étape explicitement :
WITH
CTE_reminder_rn
AS
(
SELECT
id
,start
,dateset_id
,ROW_NUMBER() OVER (PARTITION BY start ORDER BY id) AS rn
FROM reminder
)
,CTE_dateset_rn
AS
(
SELECT
id
,start
,ROW_NUMBER() OVER (PARTITION BY start ORDER BY id) AS rn
FROM dateset
)
,CTE_Joined
AS
(
SELECT
CTE_reminder_rn.id AS reminder_id
,CTE_reminder_rn.dateset_id AS old_dateset_id
,CTE_dateset_rn.id AS new_dateset_id
FROM
CTE_reminder_rn
INNER JOIN CTE_dateset_rn ON
CTE_dateset_rn.start = CTE_reminder_rn.start AND
CTE_dateset_rn.rn = CTE_reminder_rn.rn
)
UPDATE CTE_Joined
SET old_dateset_id = new_dateset_id
;
J'espère que le code indique clairement ce qu'il fait, en particulier lorsque vous le comparez à la version plus simple sans ROW_NUMBER
. Évidemment, la solution complexe fonctionnera même si start
est unique, mais pas aussi efficace qu'une solution simple.
Cette solution suppose que dateset
est vide avant ce processus.