Controllando se un elemento non esiste in un'altra tabella
Domanda
Le mie tabelle sono create qualcosa del genere:
table name: process
fields: name, id_string
table name: value_seach
fields: id_string, value
Voglio costruire un'istruzione selezionata che visualizzerà tutti i nomi dei processi (con la sua rispettiva ID_STRING) che non hanno una voce in value_search.
Può essere l'id_string nella tabella di processo nullo, e hanno ancora un nome, ma quelli devono essere esclusi se possibile. L'id_string in value_search non può mai essere nullo
Come faccio a fare questo?
Soluzione
In generale, se si desidera righe che non esistono in un'altra tabella, quindi a sinistra unisci all'altra tabella e dove ... è nullo a una colonna nella seconda tabella. Hai anche detto che non vuoi righe dove process.id_string è nullo.
SELECT p.name, p.id_string
FROM
process p
LEFT JOIN value_search v
ON v.id_string = p.id_string
WHERE
v.id_string IS NULL
AND p.id_string IS NOT NULL
Questo è noto come un anti-join.
Altri suggerimenti
Credo di usare Not Exists
Sarebbe la tua migliore opzione qui.
SELECT p.name, p.id_string
FROM process p
WHERE
NOT p.id_string IS NULL AND
NOT EXISTS(
SELECT NULL
FROM value_search v
WHERE p.id_string = v.id_string)
La domanda che desideri dovrebbe assomigliare a questa. Si noti che un join sarà significativamente più veloce di una sottoquery nella clausola Where.
SELECT p.name, p.id_string
FROM process p
LEFT OUTER JOIN value_search v
ON p.id_string = v.id_string
AND p.id_string IS NOT NULL
AND v.id_string IS NULL
Una variante altrettanto valida della query sopra sarebbe:
SELECT p.name, p.id_string
FROM process p
LEFT OUTER JOIN value_search v
ON p.id_string = v.id_string
WHERE
p.id_string IS NOT NULL
AND v.id_string IS NULL
SELECT
name,
id_string
FROM process
WHERE id_string IS NOT NULL AND id_string NOT IN SELECT id_string FROM value_seach