2017-07-06 63 views
-1

新手在這裏的sql新手SQL錯誤;缺少表達

我試圖返回SA_ID從下面的查詢,但我得到一個「缺少表達式」的錯誤。

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'} 
    ; 

sa_id存在於兩個表中; ci_sa和ci_intv_pf。

我需要sa_id在ci_intv_pf表中有一個intv_pf_typ_cd'SMPCHGRI'。 而且我需要匹配的sa_id從ci_sa表中獲得'LEURIBIL'的sa_type_cd。

試過用分組結束查詢,但沒有任何運氣。

任何幫助非常讚賞

+1

's.sa_id(選擇SA_ID ..)' –

+0

感謝@Prdp這是一個支架的問題,應該使用圓括號過! – LiamC

+1

不只是括號。當您使用'IN'時,您不能選擇多個列。在子查詢中單獨選擇'sa_id' –

回答

1

只是在內部SQL返回SA_ID:

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

'{'在'Sub-Queries'中是否在'Oracle'中工作? –

+0

@ user7294900謝謝。我需要使用括號而不是括號! – LiamC

1

贊同Prdp,但是,請考慮下面的代碼是有點快,因爲它讀取計算的,而不是價值觀 -

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

它可以更快,但它取決於兩個表之間的相對基數。 https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:953229842074解釋得相當好 - 一如既往 – BriteSponge

+0

BriteSponge,同意。 – Amey

3

您可以在您的問題中嘗試使用標準的子查詢;

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') 

一個相關子查詢,也可以使用EXISTS:

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) 

再有就是使用WITH重構子查詢,它可以使複雜的查詢有點更容易閱讀;

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' 

有可能會在效率很大程度上基於表的相對大小,但在Oracle 10g中挑選時下最有效的方式的一個不錯的工作,這一切一定的差異。

警告:我還沒有真正建立表和數據來測試這些