2017-07-06 5 views
-1

Neuling, um hier sqlNewbie SQL Fehler; fehlender Ausdruck

Ich versuche, sa_id aus der Abfrage unten zurückzugeben, aber ich bekomme einen Fehler 'fehlenden Ausdruck'.

select s.sa_id 
    from cisadm.ci_sa s 
    where s.sa_status_flg = '20' 
    and s.sa_type_cd = 'LEURIBIL' 
    and s.sa_id in { 
     select * 
     from cisadm.ci_intv_pf pf 
     where pf.intv_pf_typ_cd = 'SMPCHGRI'} 
    ; 

Die sa_id existiert in beiden Tabellen; ci_sa und ci_intv_pf.

Ich brauche die sa_id, um eine intv_pf_typ_cd von 'SMPCHGRI' in der Tabelle ci_intv_pf zu haben. Und ich brauche die passende sa_id, um eine sa_type_cd von 'LEURIBIL' aus der Tabelle ci_sa zu haben.

Habe versucht, die Abfrage mit der Gruppe zu beenden und habe aber kein Glück.

Jede große Hilfe

+1

's.sa_id zu testen (wählen sa_id ..)' –

+0

Dank @Prdp Es ist eine Klammer Problem war, sollte Klammer verwendet haben! – LiamC

+1

Nicht nur Klammer. Sie können nicht mehr als eine Spalte auswählen, wenn Sie "IN" verwenden. Wählen Sie 'sa_id' allein in der Unterabfrage –

Antwort

1

einfach das ausge sa_id in der inneren SQL geschätzt:

select s.sa_id 
    from cisadm.ci_sa s 
    where s.sa_status_flg = '20' 
    and s.sa_type_cd = 'LEURIBIL' 
    and s.sa_id in (
     select pf.sa_id 
     from cisadm.ci_intv_pf pf 
     where pf.intv_pf_typ_cd = 'SMPCHGRI') 
    ; 
+2

Funktioniert '{' in 'Oracle' für' Sub-Queries'? –

+0

@ user7294900 Danke. Ich brauche Klammern anstelle von Klammern! – LiamC

1

PRDP Unterstützen, aber beachten Sie bitte folgenden Code, der etwas schneller ist als es anstelle der Werte liest zählen -

+0

Es kann schneller sein, aber es hängt von der relativen Kardinalität zwischen den beiden Tabellen ab. https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:953229842074 erklärt ganz gut - wie immer – BriteSponge

+0

BriteSponge, vereinbart. – Amey

3

Sie können eine Standard-Unterabfrage verwenden, wie Sie in Ihrer Frage versuchen;

SELECT s.sa_id 
FROM cisadm.ci_sa s 
WHERE s.sa_status_flg = '20' 
AND s.sa_type_cd = 'LEURIBIL' 
AND s.sa_id IN (SELECT pf.sa_id 
        FROM cisadm.ci_intv_pf pf 
        WHERE pf.intv_pf_typ_cd = 'SMPCHGRI') 

Eine korrelierte Unterabfrage ist auch möglich, mit VORHANDEN:

SELECT s.sa_id 
FROM cisadm.ci_sa s 
WHERE s.sa_status_flg = '20' 
AND s.sa_type_cd = 'LEURIBIL' 
AND s.sa_id EXISTS (SELECT 1 
         FROM cisadm.ci_intv_pf pf 
         WHERE pf.intv_pf_typ_cd = 'SMPCHGRI' 
         AND pf.sa_id = s.sa_id) 

Und dann gibt es mit mit dem Sub-Abfrage Refactoring, die komplexe machen kann ein wenig leichter abfragt zu lesen;

WITH sub_query AS 
(SELECT 1 
FROM cisadm.ci_intv_pf pf 
WHERE pf.intv_pf_typ_cd = 'SMPCHGRI') 
SELECT s.sa_id 
FROM cisadm.ci_sa s 
     INNER JOIN 
     sub_query pf ON pf.sa_id = s.sa_id 
WHERE s.sa_status_flg = '20' 
AND s.sa_type_cd = 'LEURIBIL' 

Es wird wahrscheinlich einige Unterschiede in der Effizienz für alle diese stark von den relativen Größen der Tabellen basieren, aber Oracle hat einen ziemlich guten Job heute die effizienteste Art und Weise Kommissionierung.

Caveat: Ich habe nicht wirklich Tabellen und Daten eingerichtet in diesen