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

MySQL - Vælg fra en liste over tal dem uden modstykke i id-feltet i en tabel

Dette er et problem, der er ret almindeligt:​​at skabe en relation i farten uden at oprette en tabel. SQL-løsninger til dette problem er ret akavede. Et eksempel ved hjælp af en afledt tabel:

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;

Men dette skalerer ikke særlig godt, fordi du måske har mange værdier i stedet for kun seks. Det kan blive trættende at konstruere en lang liste med én UNION nødvendig pr. værdi.

En anden løsning er at have en generel tabel med ti cifre ved hånden og bruge den gentagne gange til flere formål.

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;

Jeg viser den indre forespørgsel, der genererer værdier fra 0..99, selvom dette ikke er nødvendigt i dette tilfælde. Men du har muligvis værdier større end 10 på din liste. Pointen er, at med én tabel num , kan du generere store tal uden at skulle ty til meget lange kæder med én UNION pr værdi. Du kan også angive listen over ønskede værdier ét sted, hvilket er mere bekvemt og læsbart.



  1. Sådan fungerer ADD_MONTHS() i MariaDB

  2. Nth højeste løn

  3. MySQL UDF sys_exec() virker ikke

  4. Træk en måned fra en dato i MariaDB