我有两个表,客户和工作。
我正在对客户进行报告,作为查询的一部分,我还会返回我们为每个客户完成的工作数量。代码如下:
SELECT * ,
(SELECT COUNT(*) FROM Jobs WHERE ClientID = Clients.ID) AS JobsCount
FROM Clients
我现在需要修改它以允许基于JobsCount的条件查询,例如“返回超过100个作业的所有客户”。简单地在JobsCount上添加where子句似乎不起作用 - Invalid column name 'JobsCount'.
如何查询通过子查询生成的列?
答案 0 :(得分:3)
您可以添加以下条件:
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
答案 1 :(得分: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
答案 2 :(得分:0)
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的客户端或者作业表不存在客户端。