2017-06-05 59 views
2

我有兩個表格,即客戶端和作業。對子查詢生成的字段執行查詢

我正在做一個客戶報告,作爲查詢的一部分,我還會返回我們爲每個客戶做了多少工作。代碼如下:

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

我現在需要修改這允許基於該JobsCount條件的查詢,如「返回所有客戶提供超過100個就業機會」。只需在JobsCount中添加where子句似乎無效 - Invalid column name 'JobsCount'.

如何查詢通過子查詢生成的列?

+0

將該條件從WHERE條件切換到HAVING條款,我認爲你將會開展業務。 – JNevill

+0

你在子查詢中使用這個查詢嗎? –

回答

3

您可以添加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 
+0

將第二個選項包裝到子查詢中效果很好!奇怪你不能查詢子查詢,但可以查詢查詢內的子查詢... –

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 
+1

@KannanKandasamy不,原始查詢正在運行AFAIK。問題是我們如何限制它的工作數量。簡短的回答是,如果您使用相關子查詢進行短語說明,則不能。 –

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或客戶端與作業表不存在。