По первому вопросу:
SELECT A.ID, A.Name, COUNT(ab.B_ID) AS bcount
FROM A LEFT JOIN A_B_Link ab ON (ab.A_ID = A.ID)
GROUP BY A.ID, A.Name;
Это выводит одну строку на строку A с количеством совпадающих B. Обратите внимание, что вы должны перечислить все столбцы A в выражении GROUP BY; здесь нельзя использовать подстановочный знак.
Альтернативным решением является использование коррелированного подзапроса, как показывает @Ray Booysen:
SELECT A.*,
(SELECT COUNT(*) FROM A_B_Link
WHERE A_B_Link.A_ID = A.A_ID) AS bcount
FROM A;
Это работает, но коррелированные подзапросы не очень хороши для производительности.
Для второго вопроса вам понадобится что-то вроде агрегатной функции MySQL GROUP_CONCAT()
. В MySQL вы можете получить разделенный запятыми список B.Name
на строку A, например:
SELECT A.*, GROUP_CONCAT(B.Name) AS bname_list
FROM A
LEFT OUTER JOIN A_B_Link ab ON (A.ID = ab.A_ID)
LEFT OUTER JOIN B ON (ab.B_ID = B.ID)
GROUP BY A.ID;
Нет простого эквивалента в Microsoft SQL Server. Проверьте здесь для другого вопроса на SO об этом:
" Имитация функции MySQL group_concat в MS SQL Server 2005? "
Или Google для ' Microsoft SQL Server "group_concat" ' для множества других решений.