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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top