对子查询生成的字段执行查询
我有两个表格,即客户端和作业。对子查询生成的字段执行查询
我正在做一个客户报告,作为查询的一部分,我还会返回我们为每个客户做了多少工作。代码如下:
SELECT * ,
(SELECT COUNT(*) FROM Jobs WHERE ClientID = Clients.ID) AS JobsCount
FROM Clients
我现在需要修改这允许基于该JobsCount条件的查询,如“返回所有客户提供超过100个就业机会”。只需在JobsCount中添加where子句似乎无效 - Invalid column name 'JobsCount'.
如何查询通过子查询生成的列?
您可以添加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
将第二个选项包装到子查询中效果很好!奇怪你不能查询子查询,但可以查询查询内的子查询... –
与当前用于查找每个客户端的作业数相关的相关子查询的问题,除了它不能快速运行或缩放比例之外,难以对作业数量应用限制。相反,您可以将您的查询更改为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
@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或客户端与作业表不存在。
将该条件从WHERE条件切换到HAVING条款,我认为你将会开展业务。 – JNevill
你在子查询中使用这个查询吗? –