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)?

È stato utile?

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
);

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top