2011-08-30 18 views
6

dicen que hay dos tablas:SQL: ¿Obtiene todos los registros de una tabla Y un recuento de registros de una segunda tabla?

TABLA A

messageID/Message     /More.. 
1  /This is the first message /Etc.. 
2  /This is the second message/Etc.. 
3  /This is the third message /Etc.. 

TABLA B

commentID/messageID/Comment 
1  /2  /This is a comment to the second message 
2  /2  /This is another comment to the second message 
3  /3  /This is a comment to the third message 

El lazo entre las mesas es el campo messageID.

me gustaría una consulta que genera resultados como este, en el que reunir todos los campos de la tabla A, y un recuento del número de observaciones para cada mensaje de la Tabla B, así:

messageID/Message     /More.../CommentCount 
1  /This is the first message/etc... /0 
2  /This is the second message/etc... /2 
3  /This is the third message/etc... /1 

he intentado algo como esto:

SELECT tableA.*, count(commentID) as commentcount 
FROM tableA LEFT JOIN tableB ON tableA.messageID = tableB.messageID GROUP BY messageID 

pero no funciona. ¿Algunas ideas? Parece que debería ser posible hacer esto en una consulta. Estoy usando MSSQL. Gracias por cualquier ayuda.

+2

su consulta parece correcta. Simplemente use 'COUNT (tableB.messageID)' y 'GROUP BY tableA.messageID' –

Respuesta

13

subconsulta escalar funcionará:

SELECT tableA.* 
    ,(SELECT count(commentID) FROM tableB WHERE tableA.messageID = tableB.messageID) as commentcount 
FROM tableA 

Como de costumbre, hay un montón de maneras de pelar este gato, con perfiles de rendimiento diferentes.

Cuando se utiliza un GROUP BY, todas las columnas de la salida o bien tendrá que estar en el GROUP BY o en funciones de agregado - a pesar de que no hay variación en las otras columnas dentro de un messageID, todavía tendrían que estar en el GROUP BY.

+0

Esto es exactamente lo que estaba buscando. ¡Gracias! – PDD

2

Intentar esta consulta:

SELECT a.*, b.msgCount 
    FROM tableA a LEFT JOIN 
    (SELECT messageID, COUNT(1) AS msgCount FROM tableB b GROUP BY messageID) b 
     ON a.messageID = b.messageID 
4

Usted puede utilizar CTE para el mismo.

;WITH CTE_MessageCount (MessageId, Count) 
AS 
(
SELECT MessageId, Count(*) FROM TableB GROUP BY MessageId 
) 

SELECT A.*, T.* 
FROM tableA A JOIN CTE_MessageCount T ON A.messageID = T.MessageID 
+0

Gracias a Tushar, esta es una buena solución también. Tenía "GROUP BY" solo porque estaba intentando todo tipo de enfoques diferentes pero en realidad no lo necesitaba. – PDD

+0

¡De nada! Las expresiones de tabla comunes son preferibles a las de SQL anidado ya que son más eficientes. – Tushar

Cuestiones relacionadas