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否,原始查询正在正常工作。问题是我们如何将其限制在工作数量上。简单的回答是,如果你使用一个相关的子查询来表达它,你就不能这样做。第二个选择,将它包装成一个子查询,效果非常好!奇怪的是,您不能查询子查询,但可以在查询中查询子查询。。。