Das folgende Problem möchte ich gern mit einem outer join oder vergleichbarem lösen, nicht mit einem Subselect oder IN o.ä., da die Abfrage über eine sehr große Datenmenge zügig laufen soll.
Folgende Beispieltabellen:
CREATE TABLE liste (
id serial NOT NULL,
uid integer NOT NULL,
CONSTRAINT liste_pkey PRIMARY KEY (id)
)
CREATE TABLE story (
id serial NOT NULL,
id_liste integer NOT NULL,
name character varying(10) NOT NULL,
CONSTRAINT story_pkey PRIMARY KEY (id),
CONSTRAINT story_id_liste_fkey FOREIGN KEY (id_liste) REFERENCES liste (id)
)
Ich möchte jetzt alle “name” aus story, die zu einer Menge “uid” aus liste gehören, aber nicht in den “name” einer anderen uid enthalten sind.
Mit einem Subselect würde es funktionieren und so aussehen:
select
story2.name
from
liste liste2 join story story2 on liste2.id = story2.id_liste
where
liste2.uid in (1,2,3)
and story2.name not in (select story1.name from liste liste1 join story story1 on liste1.id = story1.id_liste where liste1.uid = 4)
Ich bekomme diese Query einfach nicht mit einem Outer Join mit NULL-Abfrage hin, z.b. so:
select
story2.name
from
liste liste1
,liste liste2
,story story2 left outer join story story1 on story2.name = story1.name
where
liste1.id = story1.id_liste
and liste2.id = story2.id_liste
and liste1.uid = 1
and liste2.uid in (1,2,3)
and story1.name is null
Danke für deinen Tipp.
Ich habe es mal ausprobiert: Bei EXCEPT sind die Kosten etwas höher als beim Subselect. Da werde ich mich wohl mit dem Subselect abfinden müssen.