2016-07-14 12 views
0

で選択クエリと同じクエリ:私はのように、いくつかの「複雑」クエリに直面しているた結果

with q1 as (
select w.entity_id, p.actionable_group, p.error_type 
from issue_analysis p 
join log l on p.id = l.issue_analysis_id 
join website w on l.website_id = w.id 
where l.date >= '2016-06-01' 
group by 1, 2, 3 
), 
q2 as (
select w.entity_id, p.actionable_group, p.error_type 
from issue_analysis p 
join log l on p.id = l.issue_analysis_id 
join website w on l.website_id = w.id 
where l.date >= '2016-06-01' 
group by 1, 2, 3 
having count(1) = 1 
) 

そして

SELECT q1.entity_id, count(q1.entity_id), count(q2.entity_id) 
from q1, q2 
group by 1 
order by 1 

にしようとしたが、結果は私のために、「間違っている」データを提供し、実際には両方のカウントが含まれていないためです...

ネストしたクエリを使用しないでこのような問題を解決する最もクリーンな方法を教えてください。

q2q1と似ていますが、最後にhaving count(1) = 1となります。

P.S. ドキュメントのリンクはうまくいくでしょう。答えは簡単です。

+0

おそらく、結合が必要です。単純なルール:*常に*明示的な 'JOIN'構文を使用します。 *決して* FROM句でカンマを使用しないでください。 –

+0

q1.entity_id = q2.entity_idでq1 left join q2を使用しようとしましたが、失敗します。 –

答えて

0

疑いなく、デカルト積が得られ、これが集計に影響します。代わりに、の前にの結合を実行してください。

select q1.entity_id, q1_cnt, q2_cnt 
from (select q1.entity_id, count(*) as q1_cnt 
     from q1 
     group by q1.entity_id 
    ) q1 join 
    (select q2.entity_id, count(*) as q2_cnt 
     from q2 
     group by q2.entity_id 
    ) q2 
    on q1.entity_id = q2.entity_id; 
+0

ありがとう、@Gordon –