zweite Abfrage bei Anzahl Ergebnisse=0 starten

psa001

Neuer Benutzer
Beiträge
2
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
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.520
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)

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
 

ukulele

Datenbank-Guru
Beiträge
4.638
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?
 

ukulele

Datenbank-Guru
Beiträge
4.638
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
 
Werbung:

psa001

Neuer Benutzer
Beiträge
2
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...
 
Oben