对子查询生成的字段执行查询

问题描述:

我有两个表格,即客户端和作业。对子查询生成的字段执行查询

我正在做一个客户报告,作为查询的一部分,我还会返回我们为每个客户做了多少工作。代码如下:

SELECT * , 
(SELECT COUNT(*) FROM Jobs WHERE ClientID = Clients.ID) AS JobsCount 
FROM Clients 

我现在需要修改这允许基于该JobsCount条件的查询,如“返回所有客户提供超过100个就业机会”。只需在JobsCount中添加where子句似乎无效 - Invalid column name 'JobsCount'.

如何查询通过子查询生成的列?

+0

将该条件从WHERE条件切换到HAVING条款,我认为你将会开展业务。 – JNevill

+0

你在子查询中使用这个查询吗? –

您可以添加WHERE条件如下:

Select *, (select count(*) from Jobs where ClientId = t.Id) as JobsCount 
    from Clients t where (select count(*) from Jobs where ClientId = t.Id) > 100 

或其他简单的方式把它包装成如下另一个子查询:

Select * from (
    Select *, (select count(*) from Jobs where ClientId = t.Id) as JobsCount 
    from Clients t 
    ) a Where JobsCount > 100 
+0

将第二个选项包装到子查询中效果很好!奇怪你不能查询子查询,但可以查询查询内的子查询... –

与当前用于查找每个客户端的作业数相关的相关子查询的问题,除了它不能快速运行或缩放比例之外,难以对作业数量应用限制。相反,您可以将您的查询更改为Clients与查找每个客户端的作业数量的子查询之间的联接。然后,一个简单的WHERE条款限制可以根据客户有多少工作来限制客户。

SELECT 
    t1.*, 
    COALESCE(t2.jobCount, 0) AS jobCount 
FROM Clients t1 
INNER JOIN 
(
    SELECT t1.ID, COUNT(*) AS jobCount 
    FROM Clients t1 
    INNER JOIN Jobs t2 
     ON t1.ID = t2.ClientID 
    GROUP BY t1.ID 
) t2 
    ON t1.ID = t2.ID 
WHERE t2.jobCount > 100 -- or whatever restrictions you want 
+1

@KannanKandasamy不,原始查询正在运行AFAIK。问题是我们如何限制它的工作数量。简短的回答是,如果您使用相关子查询进行短语说明,则不能。 –

Select clients.* ,jobcount 
from clients 
inner join 
(Select COUNT(*) as jobcount,clientid FROM Jobs group by clientid having count(*)>100)Jobs 
On jobs.clientid=clients.clientid 

分组作业计数和过滤|使用具有大于100的作业计数的条件移除。内部连接将过滤|删除具有作业计数的客户端< 100或客户端与作业表不存在。