Получение количества записей в дочерней таблице с помощью оператора 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