2008-08-31 25 views
11

Tengo tres tablas: página, de fijación, página desapegode consultas SQL, contamos con 0 recuento

tengo datos como estos:

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 

quisiera obtener el número de archivos adjuntos por página también cuando ese número es 0. He tratado 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 recibiendo esta salida:

NAME  ATTACHMENTSNUMBER 
second page 2 
third page 1 

me gustaría conseguir este resultado:

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

¿Cómo consigo el 0 parcial?

Respuesta

25

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 
+0

Como David B. mencionó esta consulta no se ejecuta. Cambia el grupo por 'group by page.name' – edosoft

1

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

8

Aquí hay otra solución que utiliza la subconsulta.

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

gracias! funciona bien para mí! – tienbuiDE

2

Según la base de datos, para la 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 que necesita esta solución durante 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).

0

Utilice esta:

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