LEFT JOIN mit erstem zufälligen Eintrag

Mr. Robot

Fleissiger Benutzer
Beiträge
88
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
 
Werbung:
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.
 
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
 
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?
 
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.
 
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
 
Nein DISTINCT hätte nur einmal "22145 Schleswig-Holstein" gefiltert. Bei Hamburg hätten die beiden unterschiedlichen PLZ beide Datensätze geliefert.
 
Nein DISTINCT hätte nur einmal "22145 Schleswig-Holstein" gefiltert. Bei Hamburg hätten die beiden unterschiedlichen PLZ beide Datensätze geliefert.

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)
 
Werbung:
Warum nicht einfach ein DISTINCT?

Code:
select distinct plz, bundesland
from the_table
Und das ist genau das, was im Eingangsposting nach "als Ergebnis möchte ich:" zu sehen ist.
als Ergebnis möchte ich:

22140 Hamburg
22143 Hamburg
22145 Schleswig-Holstein

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
22140 Hamburg
22143 Hamburg
22145 Hamburg
22145 Schleswig-Holstein
Das ist schon ein Unterschied. Mit DISTINCT ON ginge es, ja, aber ist nunmal MSSQL.
 
Zurück
Oben