tipos resueltos examen ejercicios ejemplos datos consultas complejas sql count

resueltos - examen consultas sql



Consulta SQL, cuenta con 0 recuento (6)

Desea una combinación de la izquierda, en lugar de una combinación interna, ya que permite que los registros no existan.

Tengo tres tablas: página, archivo adjunto, adjunto de página

Tengo datos como este:

page ID NAME 1 first page 2 second page 3 third page 4 fourth page attachment ID NAME 1 foo.word 2 test.xsl 3 mm.ppt page-attachment ID PAGE-ID ATTACHMENT-ID 1 2 1 2 2 2 3 3 3

Me gustaría obtener el número de archivos adjuntos por página también cuando ese número es 0 . Lo he intentado con:

select page.name, count(page-attachment.id) as attachmentsnumber from page inner join page-attachment on page.id=page-id group by page.id

Estoy obteniendo esta salida:

NAME ATTACHMENTSNUMBER second page 2 third page 1

Me gustaría obtener esta salida:

NAME ATTACHMENTSNUMBER first page 0 second page 2 third page 1 fourth page 0

¿Cómo obtengo la parte 0?



Cambie su "combinación interna" a una "combinación externa izquierda", lo que significa "obtenga todas las filas a la izquierda de la combinación, incluso si no hay una fila coincidente a la derecha".

select page.name, count(page-attachment.id) as attachmentsnumber from page left outer join page-attachment on page.id=page-id group by page.name


Aquí hay otra solución usando sub-consultas.

SELECT p.name, ( SELECT COUNT(*) FROM [page-attachment] pa WHERE pa.[PAGE-ID] = p.id ) as attachmentsnumber FROM page p


Dependiendo de la base de datos, para mayor velocidad, puede usar el comando UNION.

El SQL es más largo, pero, según la base de datos, acelera las cosas separando "contar cosas que están ahí" y "contar cosas que no están ahí".

( select page.name, count(page-attachment.id) as attachmentsnumber from page inner join page-attachment on page.id=page-id group by page.id ) UNION ( select page.name, 0 as attachmentsnumber from page where page.id not in ( select page-id from page-attachment) )

La base de datos para la que necesito esta solución tiene 20 páginas en más de un millón de archivos adjuntos. La UNIÓN hizo que funcionara en 13 segundos en lugar de tanto tiempo que me aburrí y probé de otra manera (en algún lugar por encima de los 60 segundos antes de matar los métodos de combinación externa y subconsulta).


Utilizar esta:

SELECT p.name,( SELECT COUNT(*) FROM [page-attachment] pa WHERE pa.[PAGE-ID] = p.id) as attachmentsnumber FROM page p