Estoy escribiendo un trabajo para transformar datos de un diseño antiguo en uno nuevo. En este proceso, necesito tomar la identificación de una inserción en una tabla separada y usarla en una inserción en la tabla de destino, como tal:
CREATE TABLE t1 {
t1_id BIGSERIAL,
col1 VARCHAR
};
CREATE TABLE t2 {
t2_id BIGSERIAL,
col2 VARCHAR, -- renamed from col1 to avoid confusion
t1_id BIGINT REFERENCES t1.t1_id
};
Tengo el SQL definido que coincide con la siguiente forma:
WITH ins AS (
INSERT INTO t1 (t1_id) VALUES (DEFAULT) RETURNING t1_id
) INSERT INTO t2
(col1, t1_id)
SELECT
a.val1, (SELECT * FROM ins)
FROM t3 a;
Quería que esto se ejecutara SELECT * FROM ins
para cada fila del SELECT
... pero en su lugar solo se ejecuta una vez y usa ese valor para todas las filas en el SELECT
. ¿Cómo puedo reestructurar mi SQL para obtener el comportamiento deseado?
edit4
t1 termina pareciéndose a:
1,<NULL>
(1 row)
t2 termina pareciéndose a:
10,'a',1
11,'b',1 -- problem with id from t1 being 1
12,'c',1 -- problem with id from t1 being 1
.
.
Cómo quiero que se vea t1:
1,<NULL>
2,<NULL>
3,<NULL>
.
.
Cómo quiero que se vea t2:
10,'a',1
11,'b',2 -- id from t1 of 2
12,'c',3 -- id from t1 of 3
.
.
editar Para abordar lo que dijo a_horse_with_no_name, también probé esto (con el mismo resultado):
WITH ins AS (
INSERT INTO t1 (t1_id) VALUES (DEFAULT) RETURNING t1_id
) INSERT INTO t2
(col1, t1_id)
SELECT
a.val1, b.t1_id
FROM t3 a
JOIN ins b ON TRUE;
edit2
Intenté hacer referencia directa al apropiado SEQUENCE
en mi consulta, y eso SÍ funciona, pero no me gusta mucho esa solución (principalmente porque no me gusta codificar nombres de objetos). Si hay CUALQUIER solución, otra que hacer referencia directa al nombre del SEQUENCE
lo agradecería. :)
edit3
Supongo que otra solución sería hacer uso de un PROCEDURE
para hacer el en INSERT
lugar de un CTE ... pero aún así agradecería las opciones / sugerencias.
t1
y no proporciona ningún valor para t1.col1
. ¿De dónde deben venir los datos para esa columna? ¿Está t1.col1
relacionado con t2.col1
?
INSERT INTO t1 (t1_id) VALUES (DEFAULT)
inserta solo 1 fila en t1
. Por lo tanto, no importa si pones el ins
en la FROM
cláusula y lo unes t3
o no. ¿Puede mostrarnos cómo insertaría 2 (o más) filas t1
? Y lo que es más importante, ¿cómo sabe cuál de los 2 (o más) t1.id
valores coincidiría con las filas insertadas t2
?
ins
yt3