Получение количества записей в дочерней таблице с помощью оператора select

У меня есть хранимая процедура, в которой я пытаюсь выбрать все столбцы таблицы. Таблица 1. Существует другая таблица, которая использует первичный ключ Table1 как внешний ключ. Я хочу подсчитать количество записей в этой таблице внешних ключей, которые выбирают так:

SELECT *, count(*) VacancyCount
    FROM Table1 hc
    LEFT JOIN Table2 hv
    on hc.CompanyID = hv.CompanyID  
    WHERE hc.Deleted = 0
    group by hc.CompanyID
    ORDER BY NameLang1

но он дает ошибку:

Столбец "dbo.Table1.NameLang1" недействителен в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в GROUP BY пункт.

Пожалуйста, предложите, как это исправить?

Ответ 1

Попробуйте:

select 
    *,
    (select COUNT(*) from Table2 hv where hv.CompanyID=hc.CompanyID) VacancyCount
from Table1 hc
where
    hc.Deleted = 0
order by hc.NameLang1, VacancyCount desc

для заказа с использованием нового столбца

select * from(
    select 
        *,
        CONVERT(NVARCHAR(100), (select COUNT(*) from Table2 hv where hv.CompanyID=hc.CompanyID)) VacancyCount
    from Table1 hc
    where
        hc.Deleted = 0
)x
Order by CASE WHEN @OrderByParam = 1 THEN NameLang1 ELSE VacancyCount END

Столбец NameLang1 и VacancyCount имеют одинаковый тип данных.

Ответ 2

Вам нужно будет перечислить каждый столбец в предложении GROUP BY
Эти столбцы находятся в столбце SELECT *.

В любом случае это был бы правильный ANSI SQL.

SELECT * сам по себе плохо: всегда лучше явно указывать столбцы

Ответ 3

Вы делаете группировку неправильно. Вам нужно использовать все столбцы из таблицы 1 в SELECT вместо '*' и в предложении GROUP BY.

Или вы можете попробовать другой подход, подобный этому:

SELECT *
FROM Table1 hc
LEFT JOIN (SELECT CompanyID, COUNT(*) cnt FROM Table2 GROUP BY CompanyID) hv
on hc.CompanyID = hv.CompanyID  
WHERE hc.Deleted = 0
ORDER BY NameLang1

Ответ 4

Попробуйте таким образом включить список столбцов в группе

 SELECT column1,column2,column3..,NameLang1,count(*) VacancyCount
FROM Table1 hc
LEFT JOIN Table2 hv
on hc.CompanyID = hv.CompanyID  
WHERE hc.Deleted = 0
group by column1,column2,column3
ORDER BY NameLang1