Sql server 对子查询生成的字段执行查询
我有两张桌子,客户和工作 我正在做一个关于客户的报告,作为查询的一部分,我还返回了我们为每个客户做了多少工作的计数。代码如下:Sql server 对子查询生成的字段执行查询,sql-server,tsql,Sql Server,Tsql,我有两张桌子,客户和工作 我正在做一个关于客户的报告,作为查询的一部分,我还返回了我们为每个客户做了多少工作的计数。代码如下: SELECT * , (SELECT COUNT(*) FROM Jobs WHERE ClientID = Clients.ID) AS JobsCount FROM Clients 我现在需要修改它,以允许基于JobsCount的条件查询,例如“返回所有具有100个以上作业的客户端”。仅在JobsCount上添加where子句似乎不起作用-列名“JobsC
SELECT * ,
(SELECT COUNT(*) FROM Jobs WHERE ClientID = Clients.ID) AS JobsCount
FROM Clients
我现在需要修改它,以允许基于JobsCount的条件查询,例如“返回所有具有100个以上作业的客户端”。仅在JobsCount上添加where子句似乎不起作用-列名“JobsCount”无效。
如何查询通过子查询生成的列?当前用于查找每个客户端的作业数的相关子查询存在的问题,除了运行速度不快或扩展性不好之外,是难以对作业数施加限制。相反,您可以将查询重新表述为
客户端
和子查询之间的连接,该子查询查找每个客户端的作业数。然后,一个简单的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
您可以按如下方式添加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
或者以其他简单方式将其包装到另一个子查询中,如下所示:
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
对作业计数进行分组并过滤|使用作业计数>100的条件进行删除。内部联接将筛选|删除具有作业计数的客户端将该条件从
WHERE
子句切换到HAVING
子句,我认为您将进入业务。您是否在子查询中使用此查询?@KannanKandasamy否,原始查询正在正常工作。问题是我们如何将其限制在工作数量上。简单的回答是,如果你使用一个相关的子查询来表达它,你就不能这样做。第二个选择,将它包装成一个子查询,效果非常好!奇怪的是,您不能查询子查询,但可以在查询中查询子查询。。。