SQL: получить все записи из одной таблицы и количество записей из второй таблицы? - PullRequest
6 голосов
/ 30 августа 2011

Скажем, есть две таблицы:

ТАБЛИЦА 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..

ТАБЛИЦА 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

связь между таблицами заключается в поле messageID .

Я хотел бы один запрос, который генерирует результаты, подобные этому, где я извлекаю ВСЕ поля из таблицы A и подсчет количествакомментарии для каждого сообщения из таблицы B, например:

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

Я пробовал что-то вроде этого:

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

, но это не работает.Есть идеи?Похоже, что это должно быть возможно сделать в одном запросе.Я использую MSSQL.Спасибо за любую помощь.

Ответы [ 3 ]

13 голосов
/ 30 августа 2011

Скалярный подзапрос будет работать:

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

Как обычно, существует множество способов снятия кожи с этой кошки с различными профилями производительности.

При использовании GROUP BY все столбцы в выходных данных должны быть либо в GROUP BY, либо в агрегатных функциях - даже если нет никаких изменений в других столбцах в messageID, они все равно должны быть GROUP BY.

4 голосов
/ 30 августа 2011

Вы можете использовать CTE для того же.

;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
2 голосов
/ 30 августа 2011

Попробуйте этот запрос:

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 
...