2016-11-10 3 views
2

N個の条件が関連するテーブルと一致するレコードを選択します。対応するサブクエリにNOT EXISTが多すぎる行を返します

私は現在、私はNOT EXISTSサブクエリを通じて「不明」の状態を表現しようとしない限り、正常に動作します。この

select v.id, name 
from visitors v 
left join trackings t on t.visitor_id = v.id 
where 
    v.app_id = 'A0I' 
    and (
     (NOT EXISTS (
      SELECT v.id 
      FROM trackings not_t 
      WHERE v.id = not_t.visitor_id and field = 'admin' 
     )) 
     or (t.field = 'app_name' and t.string_value ILIKE 'gitchecker') 
     or (t.field = 'users_created' and t.integer_value > 0) 
    ) 
    group by v.id 
    having count(*) = 3 -- <number of conditions> 

のように達成してみてください。このサブクエリはフィルタリングされていないように見えるので、行が多すぎます。

アイデアをお持ちですか?

+1

括弧を 'WHERE'節で修正して、問題を修正します。 –

+0

私は試しましたが、残念ながら差はありません – Tarlen

+0

訪問者1人あたりの追跡数はapp_id = 'A0I'のどこにありますか? –

答えて

1

なぜあなたのバージョンが機能していないのか分かりません。 HAVING句は、一致すると2または3でなければなりません。

しかし、なぜこのようなフレーズ論理はありませんか?

select v.id, name 
from visitors v join 
    trackings t 
    on t.visitor_id = v.id 
where v.app_id = 'A0I' 
group by v.id, name 
having sum((t.field = 'app_name' and t.string_value ILIKE 'gitchecker')::int) > 0) and 
     sum((t.field = 'users_created' and t.integer_value > 0)::int) > 0 and 
     sum((t.field = 'admin')::int) = 0; 

条件に一致する必要があるため、left joinは不要です。

これらのタイプのクエリでは、set-in-setクエリ - group byhavingは、ほとんどの条件を表現する最も多彩な方法です。

+0

これは完璧な解決策です、ありがとうございます! – Tarlen

関連する問題