sql >> Databáze >  >> RDS >> Mysql

MySQL - Vyberte ze seznamu čísel ta, která nemají protějšek v poli id ​​tabulky

Toto je docela běžný problém:generování relace za běhu bez vytvoření tabulky. Řešení SQL pro tento problém jsou dost nešikovná. Jeden příklad s použitím odvozené tabulky:

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;

To se ale příliš neškáluje, protože můžete mít mnoho hodnot místo pouhých šesti. Může být únavné vytvářet dlouhý seznam s jedním UNION potřebné na hodnotu.

Dalším řešením je mít po ruce všeobecnou tabulku s deseti číslicemi a opakovaně ji používat pro různé účely.

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;

Zobrazuji vnitřní dotaz generující hodnoty od 0..99, i když to v tomto případě není nutné. Ale můžete mít ve svém seznamu hodnoty větší než 10. Jde o to, že s jednou tabulkou num , můžete generovat velká čísla, aniž byste se museli uchýlit k velmi dlouhým řetězcům s jedním UNION za hodnotu. Také můžete zadat seznam požadovaných hodnot na jednom místě, což je pohodlnější a čitelnější.



  1. Jak zacházet s MAX() prázdné tabulky jako s 0 namísto NULL

  2. Výkon MySQL:JOIN ON vs

  3. Co je nového v Postgres-XL 9.6

  4. Některé skvělé zprávy pro zákazníky Standard Edition v SQL Server 2014