Nur einen Datensätze in bestimmter Kombination

mar_hon

Benutzer
Beiträge
11
Hallo zusammen,

ich habe folgendes Problem:

1 Tabelle Konten:
Kontonummer
1: 1111
2: 222
3:333
4: 444
5: 555

2 Tabelle Abrechnungswerten zu den Kontonummern:
Kontonummer, Abrechnungswert
111, 0815
111, 0816
111, 0817
111, 0818
222, 0815
222, 0816
222, 0819
333, 0818
333, 0819
444, 0819

Ich möchte nur ausschließlich die Datensätze haben bei denen die Kontonummer in Kombination nicht 0815, 0816 zugeordnet ist oder die Kontonummer aus Tabelle 1 die nicht in Tabelle 2 enthalten ist.

also folgendes Ergebnis:
Kontonummer
333
444
555

Wie kann ich die Daten auswerten?
 
Werbung:
Ich kenne und hab kein DB2, also Standardverfahren, die dort sicher funktionieren.

Teile und herrsche, alte Programmiererregel von den Griechen oder so..
Du hast hier 2 Kriterien die unabhängig voneinander gelten sollen, also löse beide Probleme separat und kompiniere das Ergebnis. Also wörtlich einfach beides für sich lösen und verstehen, die Kombi verstehst Du dann auch.

Eine Nicht Existenz prüfst Du durch einen (left) outer join, dessen fraglicher Teil mit is null abgeprüft wird. Alle Resulte wo das "lose Ende" is null = true liefert, sind die die Du suchst.

Die Prüfung der anderen Bedingung ist etwas umständlich. Es ist ja nicht schwer, auf konkrete Inhalte zu prüfen, z.B. mit "where <feld> in (<werteliste>)". Leider trifft dann immer nur ein Datensatz miz der Bedingung zu. Daher muss man diese Ergebnisdatensätze noch Zählen, in Deinem Fall müssen es immer 2 sein, was dafür steht, dass beide Werte "gleichzeitig" vorhanden sind.
 
dunkel der Sinn Deiner Frage...

Code:
test=*# select * from konten ;
 nr | konto
----+-------
  1 |   111
  2 |   222
  3 |   333
  4 |   444
  5 |   555
(5 rows)

test=*# select *from a

test=*# select * from abrechnung ;
 konto | abw
-------+-----
   111 | 815
   111 | 816
   111 | 817
   111 | 818
   222 | 815
   222 | 816
   222 | 819
   333 | 818
   333 | 819
   444 | 819
(10 rows)


test=*# select distinct konto from konten where konto not in (select konto from abrechnung )  and konto not in (815,816);
 konto
-------
   555
(1 row)

Das würde zwar Deine Bedinging erfüllen, nicht aber Deinem Wunschresultat. Bitte prüfen
 
Erstmal vielen Dank für die Antworten.
Es ist leider noch nicht ganz das Ergebnis was ich brauche.

Ich habe mich gestern auch bei der Voraussetzung vertan:
Kontonummer darf nicht 0815 oder 0816 oder beides enthalten

Ich habe es jetzt mal so versucht:

SELECT KONTONUMMER FROM KONTO
LEFT JOIN ABRECHNUNG
ON ABRECHNUNG.KONTONUMMER = KONTO.KONTONUMMER
LEFT JOIN ABRECHNUNG
ON ABRECHNUNG.KONTONUMMER = KONTO.KONTONUMMER
AND KONTONUMMER NOT IN (SELECT KONTONUMMER FROM ABRECHNUNG WHERE KONTO NOT IN (816, 816)

Aber das passt irgendwie auch noch nicht.
Hat noch jemand einen Tipp?
 
wie wäre es, wenn Du statt Müll was konkretes liefern würdest? Deine Beispiele stimmen weder vorne noch hinten. Wir kennen nicht wirklich, was Du da hast (Datentypen z.B.), Dein '0815' ist mal Kontonummer, mal Abrechnungswert, mal ein INT(815), mal ein String('0815'). Einfach nur Müll. Werd glücklich damit.
 
Na vielen Dank für das freundliche Feedback.

Ich versuche es nochmal:

SELECT KONTONUMMER FROM KONTO
LEFT JOIN ABRECHNUNG
ON ABRECHNUNG.KONTONUMMER = KONTO.KONTONUMMER
LEFT JOIN ABRECHNUNG
ON ABRECHNUNG.KONTONUMMER = KONTO.KONTONUMMER
AND KONTONUMMER NOT IN (SELECT KONTONUMMER FROM ABRECHNUNG WHERE ABRECHNUNGSWERT NOT IN (815, 816)
 
Ich möchte nur ausschließlich die Datensätze haben bei denen die Kontonummer in Kombination nicht 0815, 0816 zugeordnet ist oder die Kontonummer aus Tabelle 1 die nicht in Tabelle 2 enthalten ist.

Das lässt sich mit zwei NOT EXISTS Bedingungen machen:

Code:
select *
from konto k
where not exists (select *
                  from abrechnung a
                  where a.kontonummer = k.kontonummer)
   or not exists (select *
                  from abrechnung a
                  where a.kontonummer = k.kontonummer
                   and a.abrechnungswert in ('0815', '0816'))

Online Beispiel
 
Werbung:
Zurück
Oben