Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL - Seleziona da un elenco di numeri quelli senza una controparte nel campo id di una tabella

Questo è un problema abbastanza comune:generare una relazione al volo senza creare una tabella. Le soluzioni SQL per questo problema sono piuttosto imbarazzanti. Un esempio che utilizza una tabella derivata:

SELECT n.id
FROM
  (SELECT 2 AS id 
   UNION SELECT 3 
   UNION SELECT 4 
   UNION SELECT 5 
   UNION SELECT 6 
   UNION SELECT 7) AS n
  LEFT OUTER JOIN foos USING (id)
WHERE foos.id IS NULL;

Ma questo non scala molto bene, perché potresti avere molti valori invece di soli sei. Può diventare noioso costruire una lunga lista con una UNION necessario per valore.

Un'altra soluzione consiste nel tenere a portata di mano una tabella generica di dieci cifre e utilizzarla ripetutamente per molteplici scopi.

CREATE TABLE num (i int);
INSERT INTO num (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);

SELECT n.id
FROM 
  (SELECT n1.i + n10.i*10 AS id
   FROM num AS n1 CROSS JOIN num AS n10
   WHERE n1.i + n10.i*10 IN (2, 3, 4, 5, 6, 7)) AS n
  LEFT OUTER JOIN foos USING (id)
WHERE foos.id IS NULL;

Mostro la query interna che genera valori da 0..99 anche se questo non è necessario per questo caso. Ma potresti avere valori maggiori di 10 nella tua lista. Il punto è che con una tabella num , puoi generare grandi numeri senza dover ricorrere a catene molto lunghe con un unico UNION per valore. Inoltre, puoi specificare l'elenco dei valori desiderati in un unico posto, che è più comodo e leggibile.