Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL - Wybierz z listy liczb te, które nie mają odpowiednika w polu id tabeli

Jest to dość powszechny problem:generowanie relacji w locie bez tworzenia tabeli. Rozwiązania SQL dla tego problemu są dość niewygodne. Jeden przykład z użyciem tabeli pochodnej:

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;

Ale to nie skaluje się zbyt dobrze, ponieważ możesz mieć wiele wartości zamiast tylko sześciu. Tworzenie długiej listy z jednym UNION może być męczące potrzebne na wartość.

Innym rozwiązaniem jest trzymanie pod ręką uniwersalnej tabeli zawierającej dziesięć cyfr i używanie jej wielokrotnie do wielu celów.

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;

Pokazuję wewnętrzne zapytanie generujące wartości od 0..99, mimo że nie jest to konieczne w tym przypadku. Ale możesz mieć na liście wartości większe niż 10. Chodzi o to, że z jedną tabelą num , możesz generować duże liczby bez konieczności uciekania się do bardzo długich łańcuchów za pomocą jednego UNION na wartość. Możesz także określić listę pożądanych wartości w jednym miejscu, co jest wygodniejsze i bardziej czytelne.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wstaw zbiorczy MySQL przez PHP

  2. MySQL SELECT n rekordów na podstawie GROUP BY

  3. Przyspieszenie dużej liczby aktualizacji i wstawek mysql

  4. Jak zaktualizować z Select za pomocą opcji Join

  5. Wstaw używając LEFT JOIN i INNER JOIN