Outer join hier möglich?

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

Habt ihr eine Idee?

Vielen Dank!
Roman

Hrm. Ich denke mal, mit JOIN, wie auch immer, bekommst das nicht hin. Falls da jemand eine Lösung bringt, wäre natürlich interessant.

Ich sehe das eher als ein EXCEPT zweier Abfragen. Du kannst ja mal Dein Subselect mit dem Plan von SELECT_1 EXCEPT SELECT_2 probieren.


Andreas

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.

Okay. Ein Subselect ist ja auch nix böses :wink:

Andreas