SQLPLUS Abfrage

wobeni

Grünschnabel
Hallo,

ich habe folgende Aufgabenstellung zu lösen. Es existieren zwei Tabellen mit dem folgenden Inhalt:

Tabelle-1:
ID Name-1 Strasse PLZ Ort
1 Mustermann Musterstrasse 1234 Musterhausen
2 Meyer Meyerstrasse 5678 Hamburg
3 Müller Müllerstrasse 3456 Frankfurt

Tabelle-2:
ID Adressschlüssel Name-1 Strasse PLZ Ort
1 100 Mustermann Wilhelmstrasse 4567 München
1 2000 Mustermann Teststrasse 5678 Hamburg
2 100 Meyer Meyerweg 7899 München

Wird nun eine Abfrage auf die ID: 1 der Tabelle-1 gemacht, sollte nachgesehen werden, ob es für die ID: 1 in der Tabelle-2 einen Adressschlüssel 100 oder 2000 gibt. Falls beide existieren, sollte die Adresse des Adressschlüssels 2000 ausgegeben werden.
Gibt es nur den Schlüssel 100, sollte diese Adresse ausgegeben werden.

Gibt es keinen Adressschlüssel in der Tabelle-2 zu einer ID, sollte die Adresse aus der Tabelle-1 ausgegeben werden ( z.B. bei der ID 3 )

Der Primärschlüssel der beiden Tabellen ist das Feld "ID".

Vielen Dank
 
Hier mein Testszenario:

SQL:
CREATE TABLE TAB1
(
        ID                        NUMBER,
        NAME                VARCHAR2(255)
);

INSERT INTO TAB1 VALUES ( 1, 'Mustermann Musterstrasse 1234 Musterhausen' );
INSERT INTO TAB1 VALUES ( 2, 'Meyer Meyerstrasse 5678 Hamburg' );
INSERT INTO TAB1 VALUES ( 3, 'Müller Müllerstrasse 3456 Frankfurt' );

CREATE TABLE TAB2
(
        ID                        NUMBER,
        KEY                        NUMBER,
        NAME                VARCHAR2(255)
);

INSERT INTO TAB2 VALUES ( 1,  100, 'Mustermann Wilhelmstrasse 4567 München' );
INSERT INTO TAB2 VALUES ( 1, 2000, 'Mustermann Teststrasse 5678 Hamburg' );
INSERT INTO TAB2 VALUES ( 2,  100, 'Meyer Meyerweg 7899 München' );

Das ganze kann man recht "einfach" mit Aggregationsfunktionen machen.

SQL:
WITH total AS
(
   SELECT  ID,
           CAST(0 AS NUMBER) AS KEY,
           NAME
   FROM    TAB1
   UNION   ALL
   SELECT  ID,
           KEY,
           NAME
   FROM    TAB2
)
SELECT
        ID,
        MIN( KEY ) KEEP ( DENSE_RANK FIRST ORDER BY key DESC ) AS KEY,
        MIN( NAME ) KEEP ( DENSE_RANK FIRST ORDER BY key DESC ) AS NAME
FROM
        total
GROUP BY ID;

 ID   KEY NAME
--- ----- ------------------------------------
  1  2000 Mustermann Teststrasse 5678 Hamburg
  2   100 Meyer Meyerweg 7899 München
  3     0 Müller Müllerstrasse 3456 Frankfurt

Zur Erkläung:
  1. Mit der WITH Klausel baue ich mir ein Subselect auf, das macht einfach nur das
    Statement etwas lesbarer. In dem Subselect Verknüpfe ich die SELECTs über beide Tabellen
    und gebe den Sätzen aus TAB1 ein KEY von 0. Somit kann ich den KEY später zur
    Priorisierung nutzen, d.h. in der Reihenfolge 2000, 100, 0
  2. Das untere SELECT gruppiert nach der ID. Innerhalb der einzelnen Gruppen muss ich nun
    den jeweils ersten Satz auslesen, wenn ich die Datensätze innerhalb der Gruppen nach dem
    KEY absteigend sortiere... soweit klar?
  3. ... fertig!
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück