Unterselect mit not in

Guten Morgen zusammen

Ich habe derzeit folgendes Problem:
Für eine Massendatenpflege auf der Datenbank wollte ich mir erst einmal die betroffenen Zeilen anzeigen lassen. Es geht darum, eine Beziehung von einer Person zu einem Kontakt A mit einem anderen Kontakt B zu überschreiben. dazu wollte ich zunächst feststellen, welche der Personen neben der Beziehung zu Kontakt A auch schon eine zu Kontakt B haben. (ich hoffe, das war jetzt halbwegs verständlich)

select k.beziehung from kontakt k 
where ref_kontakt = 293 
and k.ref_beziehung in 
(select p.ref_beziehung from kontakt p 
where ref_kontakt = 887)

Für das Update müsste ich das ganze ja negieren:

select k.beziehung from kontakt k 
where ref_kontakt = 293 
and k.ref_beziehung NOT in 
(select p.ref_beziehung from kontakt p 
where ref_kontakt = 887)

Leider liefert die zweite Abfrage grundsätzlich ein leeres Ergebnis, was aber von den Daten her falsch ist. Ich vermute einfach mal, dass ich mir das mit dem NOT zu einfach vorgestellt habe :wink:

Könnt ihr mir hier tipps geben?

Grüße

Jein. Zeige uns bitte ein CREATE TABLE und INSERT-Befehle (Copy&Paste-freundlich) und das, was rauskommen soll.


Andreas

Hallo Andreas

Der Create Table Befehl:

CREATE TABLE kontakt
(
  lid integer NOT NULL,
  luserid integer,
  luseridinsert integer,
  dtinsert timestamp without time zone,
  dtedit timestamp without time zone,
  organisation_id integer,
  ref_beziehung integer,
  ref_kontaktperson integer,
  CONSTRAINT kontakt_pkey PRIMARY KEY (lid )
)
WITH (
  OIDS=FALSE
);
ALTER TABLE kontakt
  OWNER TO postgres;

Die Dateneingabe erfolgt über ein anderes Programm, weshalb ich hier keinen insert befehl liefern kann. Ich versuche es mal zu beschreiben:
Es gibt eine tabelle bezeihungen, in der letztlich personendaten stehen. weiterhin gibt es eine tabelle mit kontaktendaten. es ist nun möglich, diesen beziehungen kontaktedaten zuzuordnen, N:M. in der Tabelle kontakt erfolgt diese zuordnung. jetzt möchte ich alle beziehungen von einem kontakt auf einen anderen kontakt umschreiben, möchte aber dabei keine dupletten erzeugen. daher der gedanke mit dem not in.
Erwartetes ergebnis:
Alle beziehungen mit kontakt 293: 119
Ergebniss der abfrage ohne NOT (also alle beziehungen, mit kontakt 293 und 887): 19
Daher müsste das ergebnis der zweiten Abfrage 100 sein, und nicht leer…

Deine Abfrage auf diese Tabelle paßt nicht auf die gezeigte Tabellendefinition.

Ist es denn sooo schwer für dich, mal eine abgespeckte Tabelle zu erstellen, da 5 oder so Datensätze reinzuwerfen und damit das nachvollziehbar zu zeigen?

Andreas

Kann ref_beziehung NULL Werte enthalten?
Wenn ja, dann ändere das Sub-Select mal in

select p.ref_beziehung 
from kontakt p 
where ref_kontakt = 887
and p.ref_beziehung IS NOT NULL