sql >> Database >  >> RDS >> Mysql

MySQL - Selecteer uit een lijst met nummers die zonder een tegenhanger in het id-veld van een tabel

Dit is een probleem dat vrij vaak voorkomt:het genereren van een relatie on-the-fly zonder een tabel te maken. SQL-oplossingen voor dit probleem zijn behoorlijk onhandig. Een voorbeeld van het gebruik van een afgeleide 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;

Maar dit schaalt niet erg goed, omdat je misschien veel waarden hebt in plaats van slechts zes. Het kan vermoeiend worden om een ​​lange lijst te maken met één UNION nodig per waarde.

Een andere oplossing is om een ​​algemene tabel van tien cijfers bij de hand te houden en deze herhaaldelijk voor meerdere doeleinden te gebruiken.

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;

Ik laat de innerlijke query zien die waarden genereert van 0..99, hoewel dit in dit geval niet nodig is. Maar mogelijk heeft u waarden groter dan 10 in uw lijst. Het punt is dat met één tabel num , kunt u met één UNION . grote aantallen genereren zonder toevlucht te hoeven nemen tot zeer lange ketens per waarde. U kunt ook de lijst met gewenste waarden op één plaats specificeren, wat handiger en leesbaarder is.



  1. Impact van uitvoeringsplan op ASYNC_NETWORK_IO Wachten - Deel 1

  2. Hoe kan ik UPDATE van een SELECT in SQL Server?

  3. Hoe grotere gegevens in de Oracle-tabellen invoegen/bijwerken?

  4. Oracle-query sequentiële sommatie per rijen