2017-06-05 8 views
2

私は2つのテーブル、クライアントとジョブを持っています。サブクエリから生成されたフィールドでクエリを実行

私はクライアントに関するレポートを作成しており、クエリの一環として、クライアントごとに行ったジョブの数も返します。私は今、このような「100の以上のジョブですべてのクライアントを返す」などJobsCountに基づいて、条件付きのクエリを、できるように、これを変更する必要が

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

次のようにコードがあります。 JobsCountにwhere句を追加するだけで動作しないようです - Invalid column name 'JobsCount'.

サブクエリで生成された列をどのようにクエリできますか?

+0

その条件を 'WHERE'節から' HAVING'節に切り替えると、あなたはビジネスになると思います。 – JNevill

+0

サブクエリ内でこのクエリを使用していますか? –

答えて

3

ジョブ数をグループ化

Select * from (
    Select *, (select count(*) from Jobs where ClientId = t.Id) as JobsCount 
    from Clients t 
    ) a Where JobsCount > 100 
+0

2番目のオプションは、サブクエリにラッピングして素晴らしい機能を果たしました!不思議なことに、サブクエリのクエリはできませんが、クエリ内のサブクエリをクエリできます。 –

0

クライアントごとのジョブの数を見つけるために現在使用している相関サブクエリの問題は、高速で実行されないか、規模が大きくなることを除いて、ジョブ数の制限を適用するのが難しい。代わりに、Clientsと各クライアントごとのジョブ数を検出するサブクエリの間の結合としてクエリを言い換えることができます。次に、単純な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 

または、以下のように別のサブクエリにそれをラップするために、他の簡単な方法:あなたが以下のように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の条件を使用して削除します。内部結合によってフィルタリングされます。ジョブ数が<のクライアントを削除するか、ジョブがジョブテーブルに存在しません。

関連する問題