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?
IZQUIERDA es tu amigo. Para obtener más información sobre los diferentes tipos de unión, consulte http://en.wikipedia.org/wiki/Join_(SQL)
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