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

时间:2017-06-05 13:28:34

标签: sql-server tsql

我有两个表,客户和工作。

我正在对客户进行报告,作为查询的一部分,我还会返回我们为每个客户完成的工作数量。代码如下:

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

我现在需要修改它以允许基于JobsCount的条件查询,例如“返回超过100个作业的所有客户”。简单地在JobsCount上添加where子句似乎不起作用 - Invalid column name 'JobsCount'.

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

3 个答案:

答案 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的客户端或者作业表不存在客户端。