2017-05-07 4 views
1

Ich habe die folgenden zwei Tabellen. Ein "Konto" kann kann viele "Anzeigen"Zeilen erhalten, wenn alle fremden Zeilen inaktiv sind

Ein Konto kann viele Anzeigen haben.

Ich möchte mit einer Abfrage kommen, die zurückgibt: jedes Konto, das keine Anzeigen mit der Spalte active auf True festgelegt hat.

Wenn das Konto keine Anzeigen enthält, sollte die Abfrage es nicht zurückgeben. Und wenn nur eine der Anzeigen für dieses Konto eine Anzeige mit der aktiven Spalte true enthält, sollte diese ebenfalls nicht zurückgegeben werden.

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 
) 
+0

Bitte fügen Sie Beispieldaten und erwartetes Ergebnis hinzu. –

Antwort

0

Below Abfrage Ergebnis gibt nur derjenigediejenigedasjenige Konto, die keine Anzeigen haben mit der Spalte aktiven Satz auf true

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

mit not exists():

select * 
from public.account a 
where not exists (
    select 1 
    from public.ad d 
    where a.id = d.account_id 
    and d.active 
    ) 
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 

Wenn jede verwandte Anzeige hat active = true - bool_or(ad.active) wirdzurückgebenund die Bedingung wird fehlschlagen. Sie erhalten also Konten mit mindestens einer verwandten Anzeige, und keine dieser Anzeigen ist aktiv.

Fügen Sie bei Bedarf weitere Spalten in den SELECT- und GROUP BY-Klauseln hinzu.

Verwandte Themen