Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [sql] Jak znaleźć brakujące ID w bazie
Forum PHP.pl > Forum > Bazy danych
M@X
Witam.
Mam baze prawie 100 000 rekordów. Każdy rekord ma swój identyfikator (ID) nadawany rosnąco. Jednak w przedziale 1 - 100 000 są pewne luki. Niektóre rekordy są wykasowane.
Chciałbym sprawdzić jakich rekordów brakuje. Wylistować te brakujące ID....
Nie moge wpaść na żaden pomysł...
Może ktoś nakierować jakim zapytaniem sql mogę coś takiego wyciągnąć ?
sowiq
  1. SELECT *
  2. FROM tabelka t1
  3. WHERE NOT EXISTS (
  4. SELECT *
  5. FROM tabelka t2
  6. WHERE t2.id = t1.id + 1
  7. )


Zapytanie dla każdego rekordu sprawdza czy istnieje rekord o ID większym o 1. Pamiętaj, że trzeba wyeliminować ostatni rekord w tabelce (bo wyższego ID nie będzie z definicji), ale to już zadanie domowe wink.gif
aniolekx
jak przerwa bedzie wieksza niz jeden rekord to nie zwroci brakujacego id, prawdopowobnie musisz wygenerowac dodatkowa tabele z id od 1 do max ile masz w twojej tabeli i poprostu przylaczyc twoja tabele z warunkiem WHERE twoja_tabla.id = NULL
Crozin
Nie podałeś o jaką bazę chodzi. W czystym SQL-u chyba trzeba będzie faktycznie utworzyć tymczasową tabelę, w takim Postgresie będziesz mógł zrobić coś w stylu:
  1. SELECT id FROM (SELECT generate_series(1, max(id)) AS id FROM tbl_name) sub WHERE id NOT IN(SELECT id FROM tbl_name);


PS. Chyba nie planujesz wykorzystać tego do "uzupełnienia" luk?
trueblue
Zakres szukany od 0-9999. Dla większego zakresu trzeba dodać kolejne "paczki" UNION i dodać je w sumowaniu id.
  1. SELECT id
  2. FROM
  3. (
  4. SELECT (a.liczba+b.liczba*10+c.liczba*100+d.liczba*1000) AS id
  5. FROM (
  6. SELECT 0 AS liczba UNION ALL
  7. SELECT 1 UNION ALL
  8. SELECT 2 UNION ALL
  9. SELECT 3 UNION ALL
  10. SELECT 4 UNION ALL
  11. SELECT 5 UNION ALL
  12. SELECT 6 UNION ALL
  13. SELECT 7 UNION ALL
  14. SELECT 8 UNION ALL
  15. SELECT 9) AS a,
  16. (
  17. SELECT 0 AS liczba UNION ALL
  18. SELECT 1 UNION ALL
  19. SELECT 2 UNION ALL
  20. SELECT 3 UNION ALL
  21. SELECT 4 UNION ALL
  22. SELECT 5 UNION ALL
  23. SELECT 6 UNION ALL
  24. SELECT 7 UNION ALL
  25. SELECT 8 UNION ALL
  26. SELECT 9) AS b,
  27. (
  28. SELECT 0 AS liczba UNION ALL
  29. SELECT 1 UNION ALL
  30. SELECT 2 UNION ALL
  31. SELECT 3 UNION ALL
  32. SELECT 4 UNION ALL
  33. SELECT 5 UNION ALL
  34. SELECT 6 UNION ALL
  35. SELECT 7 UNION ALL
  36. SELECT 8 UNION ALL
  37. SELECT 9) AS c,
  38. (
  39. SELECT 0 AS liczba UNION ALL
  40. SELECT 1 UNION ALL
  41. SELECT 2 UNION ALL
  42. SELECT 3 UNION ALL
  43. SELECT 4 UNION ALL
  44. SELECT 5 UNION ALL
  45. SELECT 6 UNION ALL
  46. SELECT 7 UNION ALL
  47. SELECT 8 UNION ALL
  48. SELECT 9) AS d
  49. ) AS tmp
  50. LEFT JOIN tabela AS t ON t.id=tmp.id
  51. WHERE t.id IS NULL
redeemer
MySQL/MariaDB:
  1. SELECT @x:=0; SELECT IF(x+1=y, y, CONCAT(x+1, '-', y)) AS `missing` FROM (SELECT id, @x:=@x+1 AS x, IF(id>@x, @x:=id, 0) AS y FROM tabela ORDER BY id ASC) t WHERE t.y>0;
M@X
Cytat(Crozin @ 5.11.2015, 18:46:47 ) *
PS. Chyba nie planujesz wykorzystać tego do "uzupełnienia" luk?

nie smile.gif spokojnie nie chodziło mi o uzupełnienie ID autoincrement smile.gif)

tu znalazłem idealne rozwiązanie: http://www.xaprb.com/blog/2005/12/06/find-...uence-with-sql/
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.