新手SQL错误;缺少表达

时间:2017-07-06 10:25:55

标签: sql oracle

新手到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表中有一个'SMPCHGRI'的intv_pf_typ_cd。 我需要匹配的sa_id从ci_sa表中获得一个sa_type_cd的'LEURIBIL'。

尝试使用group by结束查询并且没有任何运气。

任何帮助非常感谢

3 个答案:

答案 0 :(得分: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现在可以很好地选择最有效的方式。

警告:我实际上并没有设置表和数据来测试这些

答案 1 :(得分: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 :(得分: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
        );