¿Cómo puedo evitar que SELECT interno devuelva NULL?
Pregunta
¿Cómo puedo evitar que SELECT interno devuelva NULL (cuando no coincide con ninguna fila) y forzar que la consulta falle?
INSERT INTO tt (t1_id, t2_id) VALUES (
(SELECT id FROM t1 WHERE ...),
(SELECT id FROM t2 WHERE ...)
);
Pregunta secundaria: ¿hay una mejor manera de formar esta consulta (t1_id, t2_id son claves foráneas, pero podrían ser NULL)?
Solución
¿Qué tal algo como:
INSERT INTO tt (t1_id, t2_id)
SELECT t1.id, t2.id FROM t1, t2 WHERE ...
Solo asegúrese de que SELECT
devuelve exactamente lo que desea INSERT
, por lo que si es posible para t1.id
y t2 .id
para ser NULL y luego incluir la cláusula relevante en su condición WHERE
( ... AND t1.id NO ES NULL Y t2.id NO ES NULL ...
).
También puede preferir usar SELECT DISTINCT
si existe la posibilidad de que aparezcan filas duplicadas.
Editar: si necesita 2 ID de diferentes filas de la tabla misma :
SELECT t1.id, t2.id FROM some_table AS t1, some_table AS t2
WHERE ...
Otros consejos
INSERT INTO tt (t1_id, t2_id) VALUES (
(SELECT id FROM t1 WHERE ...),
(SELECT id FROM t2 WHERE ...)
)
WHERE EXISTS (SELECT id FROM t1 WHERE ...)
AND (SELECT id FROM t2 WHERE ...)
Puede parecer incómodo y redundante, pero cualquier ejecutor de SQL que valga la pena no ejecutará cada parte dos veces.
Alternativamente, si t1 y t2 están relacionados de alguna manera:
INSERT INTO tt (t1_id, t2_id)
SELECT t1.id, t2.id
FROM t1
JOIN t2 ON ...
WHERE ...
Esto se puede mejorar y usar como se indica a continuación
INSERTAR EN tt (t1_id, t2_id)
seleccione distintos t1.id, t2.id
de t1, t2
donde t1.id = t2.id
y t1.id no es nulo
y t2 id no es nulo
);