Primero, supongamos que esa (id)
es la clave principal de la tabla. En este caso, sí, las uniones son (pueden probarse) redundantes y podrían eliminarse.
Ahora eso es solo teoría, o matemáticas. Para que el optimizador realice una eliminación real, la teoría debe haberse convertido en código y agregado en el conjunto de optimizaciones / reescrituras / eliminaciones del optimizador. Para que eso suceda, los desarrolladores (DBMS) deben pensar que tendrá buenos beneficios para la eficiencia y que es un caso bastante común.
Personalmente, no suena como uno (lo suficientemente común). La consulta, como admite, parece bastante tonta y un revisor no debería dejar que pase la revisión, a menos que se haya mejorado y se elimine la unión redundante.
Dicho esto, hay consultas similares donde ocurre la eliminación. Hay una muy buena publicación de blog relacionada por Rob Farley: JOIN simplification in SQL Server .
En nuestro caso, todo lo que tenemos que hacer es cambiar las uniones por LEFT
uniones. Ver dbfiddle.uk . El optimizador en este caso sabe que la unión se puede eliminar de forma segura sin posiblemente cambiar los resultados. (La lógica de simplificación es bastante general y no está especialmente diseñada para autouniones).
Por supuesto, en la consulta original, eliminar las INNER
uniones tampoco puede cambiar los resultados. Pero no es común unirse por sí mismo en la clave principal, por lo que el optimizador no tiene este caso implementado. Sin embargo, es común unirse (o combinación izquierda) donde la columna unida es la clave principal de una de las tablas (y a menudo hay una restricción de clave externa). Lo que lleva a una segunda opción para eliminar las uniones: Agregue una restricción de clave externa (¡autoreferenciada!):
ALTER TABLE "Table"
ADD FOREIGN KEY (id) REFERENCES "Table" (id) ;
Y voila, se eliminan las uniones! (probado en el mismo violín): aquí
create table docs
(id int identity primary key,
doc varchar(64)
) ;
GO
✓
insert
into docs (doc)
values ('Enter one batch per field, don''t use ''GO''')
, ('Fields grow as you type')
, ('Use the [+] buttons to add more')
, ('See examples below for advanced usage')
;
GO
4 filas afectadas
--------------------------------------------------------------------------------
-- Or use XML to see the visual representation, thanks to Justin Pealing and
-- his library: https://github.com/JustinPealing/html-query-plan
--------------------------------------------------------------------------------
set statistics xml on;
select d1.* from docs d1
join docs d2 on d2.id=d1.id
join docs d3 on d3.id=d1.id
join docs d4 on d4.id=d1.id;
set statistics xml off;
GO
id | Doc
-: | : ----------------------------------------
1 | Ingrese un lote por campo, no use 'IR'
2 | Los campos crecen a medida que escribe
3 | Use los botones [+] para agregar más
4 | Vea los ejemplos a continuación para uso avanzado
--------------------------------------------------------------------------------
-- Or use XML to see the visual representation, thanks to Justin Pealing and
-- his library: https://github.com/JustinPealing/html-query-plan
--------------------------------------------------------------------------------
set statistics xml on;
select d1.* from docs d1
left join docs d2 on d2.id=d1.id
left join docs d3 on d3.id=d1.id
left join docs d4 on d4.id=d1.id;
set statistics xml off;
GO
id | Doc
-: | : ----------------------------------------
1 | Ingrese un lote por campo, no use 'IR'
2 | Los campos crecen a medida que escribe
3 | Use los botones [+] para agregar más
4 | Vea los ejemplos a continuación para uso avanzado
alter table docs
add foreign key (id) references docs (id) ;
GO
✓
--------------------------------------------------------------------------------
-- Or use XML to see the visual representation, thanks to Justin Pealing and
-- his library: https://github.com/JustinPealing/html-query-plan
--------------------------------------------------------------------------------
set statistics xml on;
select d1.* from docs d1
join docs d2 on d2.id=d1.id
join docs d3 on d3.id=d1.id
join docs d4 on d4.id=d1.id;
set statistics xml off;
GO
id | Doc
-: | : ----------------------------------------
1 | Ingrese un lote por campo, no use 'IR'
2 | Los campos crecen a medida que escribe
3 | Use los botones [+] para agregar más
4 | Vea los ejemplos a continuación para uso avanzado