Selektion eines nicht belegten Wertes innerhalb eines Bereiches (Oracle 10g)

TimoTH

Mitglied
Hallo,
bevor ich zur eigentlichen Frage kommen, mal kurz die vereinfachte Tabellenstruktur mit Daten:
Code:
ID  PORT    SITE
1   1       1
2   2       1
3   3       1
4   1       2
5   2       2
6   2       3

Ich suche nun einen Weg, für eine Site einen beliebigen Port zu finden, der noch nicht belegt ist. Als zulässige Werte nehmen wir mal das Intervall [1,3].


Für Site 1 wird nichts gefunden, da bereits die Port 1-3 belegt sind. Für Site 2 ist nur noch Port 3 frei. Für Site 3 könnte entweder Port 1 oder Port 3 ausgewählt werden.

Mittels einer Schleife in einer PL/SQL Prozedur kann man so etwas ja recht einfach hinbekommen.

Ich frage mich aber, ob es nicht die Möglichkeit gibt, das Ganze über ein einfaches Select-Stament zu lösen? Brüte schon eine Weile darüber, komme aber auf keinen grünen Zweig.

Über ein paar Denkanstöße würde ich mich freuen!
*gruß*
Timo
 
Als erstes stellst du eine Liste mit allen möglichen Kombinationen aus Ports und Seiten zusammen
SQL:
SELECT
    sites.site,
    ports.port 
FROM
    (
        SELECT DISTINCT site 
        FROM myTable
    ) AS sites
    (
        --Schöner währe iene Port-Tabelle, in der alle möglichen Ports aufgelistet sind
        SELECT 1 AS port FROM DUAL
        UNION SELECT 2 FROM DUAL
        UNION SELECT 3 FROM DUAL
        UNION SELECT 4 FROM DUAL
        UNION SELECT 5 FROM DUAL
        --so viele Ports wie du halt hast    
    ) AS ports

Dann kannst du diese Liste mit deiner Liste vergleichen und die fehlenden site-port-kombinationen ermitteln

SQL:
SELECT
    combi.site,
    combi.port
FROM
    (
        SELECT
            sites.site,
            ports.port 
        FROM
            (
                SELECT DISTINCT site 
                FROM myTable
            ) AS sites
            (
                --Schöner währe iene Port-Tabelle, in der alle möglichen Ports aufgelistet sind. Dann kannst du hier bereits dein Range in ein WHERE einsetzen
                SELECT 1 AS port FROM DUAL
                UNION SELECT 2 FROM DUAL
                UNION SELECT 3 FROM DUAL
                --so viele Ports wie du halt brauchst    
            ) AS ports
    ) AS combi
    LEFT JOIN myTable
        ON combi.site = myTable.site
        AND combi.port = myTable.port
WHERE
    myTable.port IS NULL

PS: Das ganze ist ungetestet und nicht unbedingt fehlerfrei
 
Zuletzt bearbeitet von einem Moderator:
Hallo yaslaw!
Grundsätzliche funktioniert deinen Lösung, dafür schonmal danke!
Ganz so einfach wie in meinem Beispiel ist die Sache natürlich nicht, aber die zusätzlichen Bedingungen bekomme ich schon eingebaut. Falls nicht, werde ich mich nochmal melden ;)

*gruß*
Timo!
 
Zurück