Consulta SQL, contar con 0 recuento
Pregunta
Tengo tres mesas:página, archivo adjunto, página adjunta
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 probado 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
Obtengo este resultado:
NAME ATTACHMENTSNUMBER
second page 2
third page 1
Me gustaría obtener este resultado:
NAME ATTACHMENTSNUMBER
first page 0
second page 2
third page 1
fourth page 0
¿Cómo consigo la parte 0?
Solución
Cambie su "unión interna" a una "unión externa izquierda", que significa "consígame todas las filas a la izquierda de la unió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
Otros consejos
Aquí hay otra solución que utiliza subconsultas.
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, dependiendo de la base de datos, acelera las cosas al separar "contar cosas que están allí" y "contar cosas que no están allí".
(
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.UNION lo hizo ejecutar en 13 segundos en lugar de tanto tiempo que me aburrí y probé de otra manera (en algún lugar más de 60 segundos antes de eliminar los métodos de subconsulta y unión externa).
Desea una combinación izquierda, en lugar de una combinación interna, ya que eso permite que los registros no existan.
La unión IZQUIERDA es tu amiga.Para obtener más información sobre los diferentes tipos de unión, consulte http://en.wikipedia.org/wiki/Join_(SQL)
Utilizar esta:
SELECT p.name,(
SELECT COUNT(*) FROM [page-attachment] pa WHERE pa.[PAGE-ID] = p.id) as attachmentsnumber
FROM page p