mysql - sumar - select con limite de registros
consulta sql para obtener registros eliminados (5)
Entonces, para empezar, mostraré la forma más fácil de generar 10.000 registros. Sin consultas enormes, sin variables. Tiempo de ejecución: ~ 3ms. ENLAZAR
Ahora sobre ese disparador que prometí. ENLAZAR
Como puede ver, es realmente fácil crear uno. Tenga en cuenta que el desencadenador es mejor no solo porque no necesita varias uniones, sino que también puede almacenar la fecha, la identificación del usuario, etc., etc. (ejemplo muy expansible). Y el punto principal de desencadenar sobre las uniones es: no importa cuántos registros haya / serán / serán. No necesitas ser estricto con el tamaño. Es por eso que llamé a la respuesta de sam yi no lo suficientemente profesional. Perdón por malentendido, estoy bastante seguro de que ninguno de nosotros quería insultar a nadie.
Al crear este ejemplo, aprendí algunas cosas. Espero que tú también lo hayas hecho :)
Tiene una tabla table1
que contiene la columna id
, que es int(11), not null, auto_increment
y comienza desde 1.
Supongamos que tiene 10,000 registros. Está claro que la identificación del último registro es 10,000. Una vez que eliminó 3 registros, tiene 9.997 registros en la tabla, pero el último valor de identificación de registro sigue siendo de 10.000 (si no se eliminó el último registro).
¿Cómo se muestran los registros que se han eliminado con 1 consulta sql?
Gracias.
Puede encontrar este sql útil aquí http://www.sqlservercurry.com/2009/06/find-missing-identity-numbers-in-sql.html
DECLARE @myTestTable1 TABLE
(
id INT IDENTITY(1,1) NOT NULL
,testVal int
)
DECLARE @increment AS int = 1
WHILE (@increment <= 10000)
BEGIN
INSERT INTO @myTestTable1
VALUES (@increment)
SET @increment += 1
END
DELETE FROM @myTestTable1 WHERE id IN (100,200,300)
--SELECT * FROM @myTestTable1
;WITH Missing (missnum, maxid)
AS
(
SELECT 1 AS missnum, (select max(id) from @myTestTable1)
UNION ALL
SELECT missnum + 1, maxid FROM Missing
WHERE missnum < maxid
)
SELECT missnum
FROM Missing
LEFT OUTER JOIN @myTestTable1 tt on tt.id = Missing.missnum
WHERE tt.id is NULL
OPTION (MAXRECURSION 0);
Pero está tomando mucho tiempo. Tenemos que reducir el tiempo.
Creo que lo más fácil sería tener una tabla ficticia / temporal con solo identificadores. 1-1000 luego se unieron a esa mesa.
Pero asegúrese de eliminar los registros "eliminados" de su tabla ficticia / temporal una vez que haya terminado. De lo contrario, aparecerán cada vez.
>> EDITAR << Puedes unirte para averiguar si te faltan identificadores ...
select a.id + 1 MissingIds
from <table> a
left join <table> b
on a.id = b.id - 1
where b.id is null
and a.id < 10000
Usé esta respuesta como referencia.
Puede usar la siguiente consulta para encontrar las lagunas, que en esencia le darán los "rangos" de registro eliminados. Por ejemplo, en el siguiente ejemplo, obtiene 2 filas en el resultado final, y los valores son 2 y 3, y 6 y 7. Así que sabe que las filas con ID de 2 a 3 se han eliminado y las filas con ID de 6 a 7 han sido eliminados (para un total de 4 filas borradas).
Creo que esto cumple con su requisito de obtener el resultado final en "1 consulta SQL", y además, no se utilizan tablas intermedias o ficticias.
delimiter $$
use test
$$
create table mytable (id int not null auto_increment, name varchar(100), primary key (id));
$$
insert into mytable (name) values(''a'')$$
insert into mytable (name) values(''b'')$$
insert into mytable (name) values(''c'')$$
insert into mytable (name) values(''d'')$$
insert into mytable (name) values(''e'')$$
insert into mytable (name) values(''f'')$$
insert into mytable (name) values(''g'')$$
insert into mytable (name) values(''h'')$$
delete from mytable where id = 2$$
delete from mytable where id = 3$$
delete from mytable where id = 6$$
delete from mytable where id = 7$$
SELECT (t1.id + 1) as gap_starts_at
, (SELECT MIN(t3.id) -1
FROM mytable t3
WHERE t3.id > t1.id) as gap_ends_at
FROM mytable t1
WHERE NOT EXISTS (SELECT t2.id FROM mytable t2 WHERE t2.id = t1.id + 1)
HAVING gap_ends_at IS NOT NULL
Salida:
gap_starts_at gap_ends_at
2 3
6 7