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.
fuente
ins
yt3
t1
y no proporciona ningún valor parat1.col1
. ¿De dónde deben venir los datos para esa columna? ¿Estát1.col1
relacionado cont2.col1
?INSERT INTO t1 (t1_id) VALUES (DEFAULT)
inserta solo 1 fila ent1
. Por lo tanto, no importa si pones elins
en laFROM
cláusula y lo unest3
o no. ¿Puede mostrarnos cómo insertaría 2 (o más) filast1
? 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 insertadast2
?Respuestas:
No entiendo por qué necesitas 2 tablas si solo tienen una relación de 1-1. Pero aquí está (
pk
es la clave principal det3
):Si su t3 es el resultado de un SELECT en lugar de una tabla preexistente, puede implementarlo como tal para que no tenga que repetir la consulta t3 dos veces:
fuente
t2_id
nada. Parece que puedes usar elt2(t1_id)
como PK det2
.ERROR: syntax error at or near "DEFAULT" LINE 2: DEFAULT AS contact_detail_id
DEFAULT
que no se puede usar de esa manera. Ni regresar elt.pk