Come posso impedire a SELECT interno di restituire NULL?
Domanda
Come posso impedire a SELECT interno di restituire NULL (quando non corrisponde a nessuna riga) e forzare l'esito negativo della query.
INSERT INTO tt (t1_id, t2_id) VALUES (
(SELECT id FROM t1 WHERE ...),
(SELECT id FROM t2 WHERE ...)
);
Domanda a margine: esiste un modo migliore per questa query (t1_id, t2_id sono chiavi esterne, ma potrebbe essere NULL)?
Soluzione
Che ne dici di qualcosa del tipo:
INSERT INTO tt (t1_id, t2_id)
SELECT t1.id, t2.id FROM t1, t2 WHERE ...
Assicurati solo che SELECT
restituisca esattamente ciò che vuoi INSERT
- quindi se è possibile per t1.id
e t2 .id
come NULL quindi includere la clausola pertinente nella condizione DOVE
( ... E t1.id NON È NULL E t2.id NON È NULL ...
).
Puoi anche preferire l'uso di SELECT DISTINCT
se esiste la possibilità che vengano visualizzate righe duplicate.
Modifica: se hai bisogno di 2 ID da diverse righe della stessa tabella:
SELECT t1.id, t2.id FROM some_table AS t1, some_table AS t2
WHERE ...
Altri suggerimenti
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 ...)
Può sembrare scomodo e ridondante, ma qualsiasi esecutore SQL degno di nota non eseguirà ogni parte due volte.
In alternativa se t1 e t2 sono in qualche modo correlati:
INSERT INTO tt (t1_id, t2_id)
SELECT t1.id, t2.id
FROM t1
JOIN t2 ON ...
WHERE ...
Può essere migliorato e utilizzato come indicato di seguito
INSERISCI IN tt (t1_id, t2_id)
seleziona t1.id distinto, t2.id
da t1, t2
dove t1.id = t2.id
e t1.id non è null
e t2 id non è nullo
);