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 inspara 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 SEQUENCEen 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 SEQUENCElo agradecería. :)
edit3
Supongo que otra solución sería hacer uso de un PROCEDUREpara hacer el en INSERTlugar de un CTE ... pero aún así agradecería las opciones / sugerencias.
fuente

insyt3t1y no proporciona ningún valor parat1.col1. ¿De dónde deben venir los datos para esa columna? ¿Estát1.col1relacionado cont2.col1?INSERT INTO t1 (t1_id) VALUES (DEFAULT)inserta solo 1 fila ent1. Por lo tanto, no importa si pones elinsen laFROMcláusula y lo unest3o 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.idvalores 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á (
pkes 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_idnada. Parece que puedes usar elt2(t1_id)como PK det2.ERROR: syntax error at or near "DEFAULT" LINE 2: DEFAULT AS contact_detail_idDEFAULTque no se puede usar de esa manera. Ni regresar elt.pk