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

zweite Abfrage bei Anzahl Ergebnisse=0 starten

Dieses Thema im Forum "Oracle" wurde erstellt von psa001, 5 Februar 2013.

  1. psa001

    psa001 Neuer Benutzer

    Hallo!

    Ich scheitere gerade an einem Basic und benötige etwas Hilfe.

    Wunsch:

    select something from x where a='abc' and b='xyz'

    Wenn die obere Abfrage keinen Treffer bringt, dann:

    select something from x where a='abc'

    (Die allgemeiner gefasste Abfrage darf nicht ausgeführt werden, wenn die andere bereits einen Wert geliefert hat)

    ################################################################################

    Mein Ansatz ist sehr zeitintensiv, da es sich um eine ODBC-Abfrage handelt.
    Ebenfalls muss zu jedes „something“ mit einem „Group by“ versehen werden, da mehrere Rows zurückkommen können. Ich habe zur Zeit etwa 4-5 Sekunden pro Abfrage, was definitiv zu viel ist...

    select something from x where a='abc' and b='xyz'
    union select something from x where
    not exists (select something from x where a='abc' and b='xyz') and a='abc'




    Meine Realität:

    select a.patidnb PATID, a.titel TITEL, a.name_prf Namenszusatz, a.name FAMILIENNAME, a.birthdt GEBURTSDATUM, a.sx Geschlecht, a.ADR Strasse, a.ZIP PLZ, a.CITY Wohnort, (case when a.EGKNB is not null then a.EGKNB else b.mitgliednr end) as Versichertennummer , a.ARCH_FL, b.inst_kennung Kassennummer from PATD a, PATDSUP b where a.patidnb=b.patorordnb and a.name like':3101%' and a.birthdt=':3103' and ((b.mitgliednr=':3105') or (a.egknb=':3105')) and a.arch_fl<>'D' group by a.patidnb, a.titel, a.name_prf, a.name, a.birthdt, a.sx, a.ADR, a.ZIP, a.CITY, a.ARCH_FL, b.inst_kennung, a.EGKNB, b.mitgliednr order by a.name

    union select a.patidnb PATID, a.titel TITEL, a.name_prf Namenszusatz, a.name FAMILIENNAME, a.birthdt GEBURTSDATUM, a.sx Geschlecht, a.ADR Strasse, a.ZIP PLZ, a.CITY Wohnort, (case when a.EGKNB is not null then a.EGKNB else b.mitgliednr end) as Versichertennummer , a.ARCH_FL, b.inst_kennung Kassennummer from PATD a, PATDSUP b

    where not exist

    (select a.patidnb PATID, a.titel TITEL, a.name_prf Namenszusatz, a.name FAMILIENNAME, a.birthdt GEBURTSDATUM, a.sx Geschlecht, a.ADR Strasse, a.ZIP PLZ, a.CITY Wohnort, (case when a.EGKNB is not null then a.EGKNB else b.mitgliednr end) as Versichertennummer , a.ARCH_FL, b.inst_kennung Kassennummer from PATD a, PATDSUP b where a.patidnb=b.patorordnb and a.name like':3101%' and a.birthdt=':3103' and ((b.mitgliednr=':3105') or (a.egknb=':3105')) and a.arch_fl<>'D' group by a.patidnb, a.titel, a.name_prf, a.name, a.birthdt, a.sx, a.ADR, a.ZIP, a.CITY, a.ARCH_FL, b.inst_kennung, a.EGKNB, b.mitgliednr order by a.name)


    and a.patidnb=b.patorordnb and a.name like':3101%' and a.birthdt=':3103' and a.arch_fl<>'D' group by a.patidnb, a.titel, a.name_prf, a.name, a.birthdt, a.sx, a.ADR, a.ZIP, a.CITY, a.ARCH_FL, b.inst_kennung, a.EGKNB, b.mitgliednr order by a.name
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Da was mit UNION zu basteln war auch mein erster Gedanke, aber: der dürfte dann quasi den Nachteil haben, daß das IMMER ALLES ausgeführt wird. Du kommst vermutlich schneller, wenn Du das in der Applikation machst. Also, zuerst die eine Abfrage, ist die leer, dann die andere. Passende Indexe sind vorhanden? Was sagt Explain?

    Andreas
     
    psa001 gefällt das.
  3. ukulele

    ukulele Datenbank-Guru

    Schonmal probiert auf UNION zu verzichten? Auserdem brauchst du bei EXISTS nur prüfen, ob etwas zurückgegeben wird und nicht alle Infos wirklich zurück geben. Hier lasse ich mal nur eine 1 zurückgeben.
    Code:
    SELECT    something
    FROM    x
    WHERE    a = 'abc'
    AND    (    b = 'xyz'
    OR        NOT EXISTS (    SELECT    1
                            FROM    x
                            WHERE    a = 'abc'
                            AND        b = 'xyz' ) )
    Ansonsten würde ich sagen ist die Ausgangsdatenbank zu langsam. Du sagtest du greifst per ODBC auf eine andere DB zu, ist das auch Oracle? Hat die einen Index auf a und b?
     
    psa001 gefällt das.
  4. ukulele

    ukulele Datenbank-Guru

    Oder halt eine IF Abfrage in TSQL:
    Code:
    IF EXISTS (    SELECT    1
                FROM    x
                WHERE    a = 'abc'
                AND        b = 'xyz' )
    BEGIN
        SELECT    something
        FROM    x
        WHERE    a = 'abc'
        AND        b = 'xyz'
    ELSE
        SELECT    something
        FROM    x
        WHERE    a = 'abc'
    END
     
    psa001 gefällt das.
  5. psa001

    psa001 Neuer Benutzer

    SELECT something
    FROM x
    WHERE a = 'abc'
    AND ( b = 'xyz'
    OR NOT EXISTS ( SELECT 1
    FROM x
    WHERE a = 'abc'
    AND b = 'xyz' ) )


    Es ist verblüffend, wie einfach eine Lösung sein kann. In "Langtext" wurde es so umgesetzt und es funktioniert viel besser als mein erster Ansatz:

    select PATID, FAMILIENNAME, GEBURTSDATUM, Geschlecht, Strasse, PLZ, Wohnort, Versichertennummer, Kassennummer, TITEL, Namenszusatz from
    (
    select a.patidnb PATID, a.titel TITEL, a.name_prf Namenszusatz, a.name FAMILIENNAME, a.birthdt GEBURTSDATUM, a.sx Geschlecht, a.ADR Strasse, a.ZIP PLZ, a.CITY Wohnort, (case when a.EGKNB is not null then a.EGKNB else b.mitgliednr end) as Versichertennummer , a.ARCH_FL, b.inst_kennung Kassennummer
    from PATD a, PATDSUP b
    where a.patidnb=b.patorordnb and a.name like'H%' and a.birthdt='22.08.1974' and ( ((b.mitgliednr='keineNummer') or (a.egknb='keineNummer'))
    or not exists (select a.patidnb PATID from PATD a, PATDSUP b where a.patidnb=b.patorordnb and a.name like'H%' and a.birthdt='22.08.1974' and ((b.mitgliednr='keineNummer') or (a.egknb='keineNummer'))))
    )
    group by PATID, FAMILIENNAME, GEBURTSDATUM, Geschlecht, Strasse, PLZ, Wohnort, Versichertennummer, Kassennummer, TITEL, Namenszusatz

    DANKE!!
    a.ARCH_FL kann noch gestrichen werden als Rückgabewert, wird nur für Where-Klausel benötigt...
     
    Walter gefällt das.
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