2013-05-15 74 views
10

我有一个存储过程,其中我试图选择表1中的所有列。还有另一个表使用Table1主键作为外键。我想指望在这个外键表的记录数选择这样的:使用select语句获取子表中的记录数

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 

,但它给错误:

Column 'dbo.Table1.NameLang1' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

请建议如何解决这一问题?

回答

21

请尝试:

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 

提供的列NameLang1VacancyCount订购具有相同的数据类型。

+1

我们可以通过使用计数结果排序包括在组列列表? – DotnetSparrow

+0

是的...当然...你可以添加'VacancyCount desc'或'VacancyCount asc'。 – TechDo

+0

techdo:我正在尝试此订单 \t CASE WHEN @OrderByParam = 1 THEN NameLang1 ELSE VacancyCount END但它表示无效的列空缺计数 – DotnetSparrow

2

您必须列出GROUP BY子句中的每一列
这些列位于SELECT *位中的那些列。

无论如何,这将是正确的ANSI SQL。

SELECT *本身是坏的呢:它始终是更好地明确列出列

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 
+0

我们可以使用cnt按结果排序吗? – DotnetSparrow

+0

当然,当它作为子查询打包并且可以用于任何子句(包括order by)时,它就变成普通列。 – ZZa

+0

我正在使用techdo答案,但当我使用Order by \t CASE WHEN @OrderByParam = 1 THEN NameLang1 ELSE VacancyCount END它说无效列空缺数 – DotnetSparrow

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 
相关问题