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

LEFT JOIN mit erstem zufälligen Eintrag

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Datenbank-Neuling, 22 Juli 2020.

  1. Datenbank-Neuling

    Datenbank-Neuling Aktiver Benutzer

    Hallo zusammen,

    ich habe eine Tabelle mit PLZ und Bundesland Zuordnungen:

    PLZ BUNDESLAND
    22140 Hamburg
    22143 Hamburg
    22145 Schleswig-Holstein
    22145 Hamburg
    22145 Schleswig-Holstein

    Um die PLZ Eindeutig zu machen möchte ich nur den ersten Eintrag in der Tabelle nehmen. D.h. als Ergebnis möchte ich:

    22140 Hamburg
    22143 Hamburg
    22145 Schleswig-Holstein

    Wie lässt sich das am einfachsten umsetzen? Im Anschluss möchte ich diese Tabelle für ein LEFT JOIN nutzen um der PLZ die Bundesländer zuzuordnen. Vielleicht lässt sich das direkt im JOIN umsetzen?

    Viele Grüße
     
  2. akretschmer

    akretschmer Datenbank-Guru

    nicht ganz klar, was Du willst. Es gibt keinen 'ersten Eintrag', ohne ein Sortiermerkmal hast Du eine Menge von Datensätzen ohne eine innere Ordnung. Du müstest also sagen: mit der numerischen/alphanumerischen kleinsten PLZ zu jedem Bundesland. Das ginge z.B. als "select bundesland, min(plz) from TABELLE group by bundesland". Dann würden aber nicht 2 PLZ für Hamburg auftauchen. Diese Ergebnissmenge als Grundlage für einen JOIN zu verwenden ist dann easy.
     
  3. castorp

    castorp Datenbank-Guru

    Warum nicht einfach ein DISTINCT?

    Code:
    select distinct plz, bundesland
    from the_table
    Das kann man auch in einem JOIN verwenden:

    Code:
    select ...
    from some_table st
      left join ( 
        select distinct plz, bundesland
        from the_table 
     ) bl on bl.bundesland = st.bundesland
     
  4. akretschmer

    akretschmer Datenbank-Guru

    ja, warum eigentlich nicht? ;-)
     
  5. ukulele

    ukulele Datenbank-Guru

    DISTINCT würde ja nach wie vor mehrere Zeilen zurück liefern. Er will glaube ich den erst besten Ort zur PLZ nehmen. Das wäre entweder
    Code:
    SELECT TOP 1 ort FROM tabelle WHERE plz = '12345'
    oder, wenn es um eine Liste aller PLZ geht
    Code:
    WITH t AS ( SELECT ROW_NUMBER() OVER (PARTION BY plz ORDER BY ort) AS zeile,* FROM tabelle ) SELECT t.* FROM t WHERE t.zeile = 1
    Bei ersterem wäre der Select zumindest theoretisch zufällig, bei letzterem ist ein ORDER BY-Kriterium glaube ich zwingend. Oder ist wirklich Zufall gefordert?
     
    Datenbank-Neuling gefällt das.
  6. Datenbank-Neuling

    Datenbank-Neuling Aktiver Benutzer

    Ein DISTINCT reicht hier nicht aus. Dann haben wir

    PLZ BUNDESLAND
    22140 Hamburg
    22143 Hamburg
    22145 Schleswig-Holstein
    22145 Hamburg

    Und die PLZ ist nicht eindeutig. Aber habe es jetzt mit der WINDOW FUNCTION und ROW_NUMBER() gelöst.
     
  7. Datenbank-Neuling

    Datenbank-Neuling Aktiver Benutzer

    Danke Ukulele. Genau so habe ich es gemacht.
     
  8. castorp

    castorp Datenbank-Guru

    Naja, in dem Beispiel aus dem Eingangsposting hast Du als zu erwartendes Ergebnis sowohl "22140 Hamburg" als auch "22143 Hamburg" geschrieben - das wäre genau das was DISTINCT macht
     
  9. ukulele

    ukulele Datenbank-Guru

    Nein DISTINCT hätte nur einmal "22145 Schleswig-Holstein" gefiltert. Bei Hamburg hätten die beiden unterschiedlichen PLZ beide Datensätze geliefert.
     
  10. castorp

    castorp Datenbank-Guru

    Und das ist genau das, was im Eingangsposting nach "als Ergebnis möchte ich:" zu sehen ist.
     
  11. akretschmer

    akretschmer Datenbank-Guru

    für die PostgreSQL-verwöhnten unter uns:

    Code:
    test=*# select * from bla;
      plz  |     bundesland     
    -------+--------------------
     22140 | hamburg
     22143 | hamburg
     22145 | schleswig-holstein
     22145 | hamburg
     22145 | schleswig-holstein
    (5 rows)
    
    test=*# select distinct on (bundesland) bundesland, plz from bla;
         bundesland     |  plz  
    --------------------+-------
     hamburg            | 22140
     schleswig-holstein | 22145
    (2 rows)
    
     
  12. ukulele

    ukulele Datenbank-Guru

    Code:
    WITH the_table(PLZ,BUNDESLAND) AS (
        SELECT '22140','Hamburg' UNION ALL
        SELECT '22143','Hamburg' UNION ALL
        SELECT '22145','Schleswig-Holstein' UNION ALL
        SELECT '22145','Hamburg' UNION ALL
        SELECT '22145','Schleswig-Holstein'
        )
    SELECT DISTINCT plz,bundesland FROM the_table
    Das ist schon ein Unterschied. Mit DISTINCT ON ginge es, ja, aber ist nunmal MSSQL.
     
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