Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Nur einen Datensätze in bestimmter Kombination

Dieses Thema im Forum "DB2" wurde erstellt von mar_hon, 18 März 2021.

  1. mar_hon

    mar_hon Benutzer

    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?
     
  2. dabadepdu

    dabadepdu Datenbank-Guru

    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.
     
  3. akretschmer

    akretschmer Datenbank-Guru

    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
    
    
     
  4. mar_hon

    mar_hon Benutzer

    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?
     
  5. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  6. mar_hon

    mar_hon Benutzer

    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)
     
  7. castorp

    castorp Datenbank-Guru

    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
     
    Walter gefällt das.
  8. mar_hon

    mar_hon Benutzer

    @castorp
    Super, vielen herzlichen Dank!
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden