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

sql doppelte einträge ausblenden

Dieses Thema im Forum "Oracle" wurde erstellt von rollon, 1 Juni 2017.

  1. rollon

    rollon Benutzer

    Hallo,
    Ich stehe vor folgendem Problem :
    Ich habe zwei Tabellen:
    Tabelle Kunde und Tabelle Fahrzeug

    Ich muss alle Kunden selektieren und dazu das Feld Kennzeichen aus der Tabelle Fahrzeug dazufügen.
    Nun gibt es in der Tabelle Fahrzeug mehrere Einträge zu einem Kunden. Ich benötige jedoch pro Kunde nur eine Zeile.

    Wie könnte man das lösen?

    1 Huber
    2 Maier

    1 w2350
    1 w5578
    2 w9987
    2 w9999
    2 w3333

    Ausgabe:
    1 Huber w2350
    2 Maier w9987
     
  2. akretschmer

    akretschmer Datenbank-Guru

    welches soll denn genommen werden, wenn mehr als 1 da ist?
     
  3. akretschmer

    akretschmer Datenbank-Guru

    Du könntest normal joinen und z.B. max(kennzeichen) verwenden und auf den Kunden gruppieren.
     
  4. rollon

    rollon Benutzer

    Es sollte das erste Kennzeichen genommen werden. Außerdem darf das Löschkennzeichen nicht gesetzt sein Loeschkz = 'N'
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Es gibt in Datenbanken kein 'erstes', solange man nicht sortiert.

    Code:
    te
    test=*# create table rollon(t text);
    CREATE TABLE
    test=*# insert into rollon values ('erster');
    INSERT 0 1
    test=*# insert into rollon values ('zweiter');
    INSERT 0 1
    test=*# select * from rollon;
      t   
    ---------
     erster
     zweiter
    (2 Zeilen)
    
    test=*# update rollon set t = 'erster' where t = 'erster';
    UPDATE 1
    test=*# select * from rollon;
      t   
    ---------
     zweiter
     erster
    (2 Zeilen)
    
    test=*#
    

    Du must also exakt definieren, was Du willst. Oder MySQL nehmen, das hat eine eingebaute Zufallsfunktion für Ergebnisse ;-)
     
  6. rollon

    rollon Benutzer

    Bei meiner Abfrage ist es nicht relevant, welches Kennzeichen kommt, wenn es mehrere gibt.
    Hintergrund : Die Daten sollen in die Telefonanlage eingespielt werden. Wenn ein Kunde anruft, soll der Name und ein Kennzeichen aufscheinen.
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Okay. Nun ja, die Lösung hatte ich Dir ja schon in #3 gezeigt.
     
  8. rollon

    rollon Benutzer

    ok, die Lösung im #3 funktioniert. Ich bräuchte noch eine zusätzliche Spalte. Leider funktioniert die Abfrage nur mit 2 Spalten. Gibt's eine Möglichkeit 3 Spalten auszugeben?
     
  9. akretschmer

    akretschmer Datenbank-Guru

    Schön. Dürfen wir den Rest erraten?
     
  10. rollon

    rollon Benutzer

    Entschuldige wenn die Frage zu undeutlich war.
    Meine Abfrage gibt mir das richtige Ergebnis.

    select a.gptnrkunde, min(a.amtkennz) as amt from (select * from fahrzeug where loeschkz = 'N') a
    group by a.gptnrkunde

    Nun möchte ich es um die Modellbezeichnung erweitern.:

    select a.gptnrkunde, a.modbezeichnung, min(a.amtkennz) as amt from (select * from fahrzeug where loeschkz = 'N') a
    group by a.gptnrkunde

    Ich bekomme jedoch einen Fehler. Gibt es eine Möglichkeit die 3. Spalte reinzukriegen?
     
  11. akretschmer

    akretschmer Datenbank-Guru

    Du hast, vereinfacht, diese Tabelle und diesen Fehler, oder?

    Code:
    test=*# create table demo(a int, b int, c int);
    CREATE TABLE
    test=*# select a, max(c) from demo group by a;
     a | max
    ---+-----
    (0 Zeilen)
    
    test=*# select a,b, max(c) from demo group by a;
    FEHLER:  Spalte »demo.b« muss in der GROUP-BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden
    ZEILE 1: select a,b, max(c) from demo group by a;
      ^
    test=*#
    
    Das schöne an PostgreSQL ist u.a. auch, daß in der Fehlermeldung schon steht, wie man das Problem lösen kann.
     
  12. drdimitri

    drdimitri Datenbank-Guru

    In Oracle lautet die Fehlermeldung eigentlich genauso...
    Wieso ist es immer so schwer die Fehlermeldung zu posten anstatt nur kund zu tun, dass es einen gegeben hat?
     
    akretschmer gefällt das.
  13. rollon

    rollon Benutzer

    Wenn ich a.modbezeichnung in der group by - Bedingungerscheinen lasse lasse, bekomme ich wieder mehr Ergebnisse mit mehreren Kennzeichen pro Geschäftspartnernummer

    Abfrage:
    select a.gptnrkunde, a.modbezeichnung, min(a.amtkennz) as amt from (select * from fahrzeug where loeschkz = 'N') a
    group by a.gptnrkunde, a.modbezeichnung
     
  14. Monarch

    Monarch Benutzer

    Hallo Rollon,

    schwer festzustellen wo dein Problem liegt!. Aber ich versuche es mal ...

    So wie ich dich verstehe soll nur ein Datensatz pro Geschäftspartnernummer zurückgegeben werden. Also darf eine Gruppierung eben auch nur auf die Geschäftspartnernummer erfolgen, wenn du die Gruppierung auch auf die modbezeichnung erweiterst erzeugst du eine Variants die zwangsweise bei mehreren Modbezeichnungen pro Geschäftspartnernummer entsteht. Also so ...

    SELECT gptnrkunde,
    MAX(modbezeichnung) a,
    MAX(amtkennz) b
    FROM Fahrzeug
    WHERE loeschkz = 'N'
    GROUP gptnrkunde

    Hoffe das es dir hilft ... Monarch
     
  15. rollon

    rollon Benutzer

    Ja, danke - das ist die Lösung !
     
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