2017-05-07 3 views
1

次の2つの表があります。 「アカウント」には多くの「広告」がありますすべての外部行がアクティブでない場合に行を取得する

アカウントには多くの広告が表示されます。

返されるクエリは、activeがtrueに設定された広告を持たないアカウントがあります。

アカウントに広告がない場合は、クエリから返されません。また、そのアカウントに関連する広告の1つに、アクティブな列がtrueに設定された広告がある場合は、それも返されません。

select * 
from public.account a 
where not exists (
    select 1 
    from public.ad d 
    where a.id = d.account_id 
    and d.active 
    ) 
+0

サンプルデータと予想される結果を追加してください。 –

答えて

0

not exists()を使用して、真の

SELECT * FROM public.account a 
LEFT JOIN public.ad ad ON (a.id = ad.account_id) 
WHERE a.active = true AND ad.account_id IS NULL; 
0

の列のアクティブセットを持つ任意の広告を持っていないだけで、それらのアカウントの結果が得られます関連する広告にはactive = truebool_or(ad.active)が返されます。trueと条件が成立しない。したがって、少なくとも1つの関連広告を持つアカウントを取得し、その広告のうちのいずれもアクティブではありません。

必要に応じて、SELECT句とGROUP BY句に列を追加します。

0
select a.id 
from public.account a 
join public.ad ad on ad.account_id = a.id 
group by a.id 
having bool_or(ad.active) = false 

の場合:クエリ以下

CREATE TABLE public.account 
(
    id bigint NOT NULL DEFAULT nextval('account_id_seq'::regclass), 
    password text COLLATE pg_catalog."default", 
    insert_time timestamp with time zone DEFAULT now(), 
    email_account_id bigint, 
    phone_number text COLLATE pg_catalog."default", 
    active boolean NOT NULL DEFAULT true, 
    CONSTRAINT account_pkey PRIMARY KEY (id), 
    CONSTRAINT account_email_account_id_fkey FOREIGN KEY (email_account_id) 
     REFERENCES public.email_account (id) MATCH SIMPLE 
     ON UPDATE CASCADE 
     ON DELETE CASCADE 
) 


CREATE TABLE public.ad 
(
    id bigint NOT NULL DEFAULT nextval('model_id_seq'::regclass), 
    name text COLLATE pg_catalog."default" NOT NULL, 
    insert_time timestamp with time zone DEFAULT now(), 
    ad_url text COLLATE pg_catalog."default", 
    account_id bigint NOT NULL, 
    active boolean NOT NULL DEFAULT true, 
    CONSTRAINT ad_pkey PRIMARY KEY (id), 
    CONSTRAINT ad_account_id_fkey FOREIGN KEY (account_id) 
     REFERENCES public.account (id) MATCH SIMPLE 
     ON UPDATE CASCADE 
     ON DELETE CASCADE 
) 
関連する問題