Как получить количество элементов в одном столбце, которые соответствуют элементам в другом столбце? - PullRequest
3 голосов
/ 26 января 2009

Предположим, у меня есть две таблицы данных и таблица ссылок как таковая:


A         B         A_B_Link          
-----     -----     -----
ID        ID        A_ID
Name      Name      B_ID

2 вопроса:

  1. Я хотел бы написать запрос, чтобы у меня были все столбцы A и подсчет количества B, связанных с A, каков наилучший способ сделать это?

  2. Есть ли способ, чтобы запрос возвращал строку со всеми столбцами из A и столбец, содержащий все связанных имен из B (возможно, разделенных некоторым разделителем?)

Обратите внимание, что запрос должен возвращать отдельные строки из A , поэтому простое левое внешнее соединение здесь не сработает ... Я предполагаю, что мне понадобятся вложенные операторы select?

Ответы [ 3 ]

3 голосов
/ 26 января 2009

По первому вопросу:

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" ' для множества других решений.

3 голосов
/ 26 января 2009

для # 1

SELECT A.*, 
(SELECT COUNT(*) FROM A_B_Link WHERE A_B_Link.A_ID = AOuter.A_ID)
FROM A as AOuter
2 голосов
/ 26 января 2009
SELECT A.*, COUNT(B_ID)
FROM A
LEFT JOIN A_B_Link ab ON ab.A_ID=A.ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...