MySQL: znajdź brakujące identyfikatory zamówień
Znam to pytanie kilka razy w StackOverFlow. Próbowałem kilku z nich, ale nie mam szczęścia.
Mam tabelę MySQL, w której znajduje się pole (orders_id
) który może pojawić się losowo w tabeli (Nie sekwencyjnie) i muszę dowiedzieć się, których identyfikatorów brakuje w tabeli.
orders_id product_name qty 1007 Wireless Mouse 1 1000 Laptop 1 1004 Wireless Mouse 3 1020 PC 3 1003 Wireless Mouse 4 1025 IPAD 4 1026 iphone 1
Oczekiwana odpowiedź:
Założyćorders_id
startując od1000.
orders_id 1000 1001 1002 1005 1006 1008 ......
Stworzyłem już powyższą tabelę w „SqlFiddle”, możecie ją wykorzystać.
** SQL próbowałem: **
declare @id int
declare @maxid int
set @id = 1
select @maxid = max(`orders_id`) from orders
create temporary table IDSeq
(
id int
)
while @id < @maxid
begin
insert into IDSeq values(@id)
set @id = @id + 1
end
select
s.id
from
idseq s
left join orders t on
s.id = t.`orders_id`
where t.`orders_id` is null
drop table IDSeq
Wziąłem powyższy SQL z następującej odpowiedzi:
SQL: znajdź brakujące identyfikatory w tabeli
wypróbowałem również ANSI SQL:
SELECT a.orders_id+1 AS start, MIN(b.orders_id) - 1 AS end
FROM orders AS a, orders AS b
WHERE a.orders_id < b.orders_id
GROUP BY a.orders_id
HAVING start < MIN(b.orders_id)
Każdy ma jakiś pomysł? jak mogę znaleźć identyfikator brakujących zamówień.