Unterselect mit not in

Fragen und Probleme rund um die Abfragespache SQL.

Unterselect mit not in

Beitragvon Reptil » Do 9. Aug 2012, 09:03

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)

Code: Alles auswählen
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:

Code: Alles auswählen
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 ;-)

Könnt ihr mir hier tipps geben?

Grüße
Reptil
Neuer Benutzer
 
Beiträge: 4
Registriert: Di 9. Aug 2011, 13:25

Beitragvon akretschmer » Do 9. Aug 2012, 09:54

Reptil hat geschrieben: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)


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


Andreas
--
ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)

https://www.xing.com/profile/Andreas_Kretschmer7
Hosting-Provider mit PostgreSQL-Support gesucht? Mich fragen!
akretschmer
Erfahrener Benutzer
 
Beiträge: 5938
Registriert: So 29. Okt 2006, 14:35
Wohnort: Kaufbach, Sachsen, Germany, Germany

Beitragvon Reptil » Do 9. Aug 2012, 10:39

Hallo Andreas

Der Create Table Befehl:
Code: Alles auswählen
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...
Reptil
Neuer Benutzer
 
Beiträge: 4
Registriert: Di 9. Aug 2011, 13:25

Beitragvon akretschmer » Do 9. Aug 2012, 10:54

Reptil hat geschrieben: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
--
ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)

https://www.xing.com/profile/Andreas_Kretschmer7
Hosting-Provider mit PostgreSQL-Support gesucht? Mich fragen!
akretschmer
Erfahrener Benutzer
 
Beiträge: 5938
Registriert: So 29. Okt 2006, 14:35
Wohnort: Kaufbach, Sachsen, Germany, Germany

Beitragvon castorp » Do 9. Aug 2012, 11:14

Reptil hat geschrieben:
Code: Alles auswählen
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 ;-)
Kann ref_beziehung NULL Werte enthalten?
Wenn ja, dann ändere das Sub-Select mal in
Code: Alles auswählen
select p.ref_beziehung
from kontakt p
where ref_kontakt = 887
and p.ref_beziehung IS NOT NULL
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'
castorp
Erfahrener Benutzer
 
Beiträge: 673
Registriert: Sa 27. Jun 2009, 22:24


Zurück zu SQL

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste

cron