我有一个存储过程,我试图选择表的所有列表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中 子句。
请建议如何解决这个问题?
答案 0 :(得分:29)
请尝试:
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
具有相同的数据类型。
答案 1 :(得分:2)
您必须列出GROUP BY子句中的每一列
这些列是SELECT *
位中的列。
无论如何,这将是正确的ANSI SQL。
无论如何, SELECT *
本身都很糟糕:明确列出列
答案 2 :(得分:2)
你正在做错分组。您需要使用SELECT中的表1中的所有列而不是'*'以及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
答案 3 :(得分:0)
尝试以这种方式包括
组中的列列表 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