新手SQL错误;缺失表达

新手SQL错误;缺失表达,sql,oracle,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 = 'S

这里是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_type_cd。 我需要匹配的sa_id从ci_sa表中获得一张sa_类型的'LEURIBIL'cd

已尝试使用group by结束查询,但运气不佳


非常感谢的任何帮助

只需在内部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')
    ;

赞同PRDP,但是请考虑下面的代码,因为它读计数而不是值-< /P>

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

您可以在尝试回答问题时使用标准子查询

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在选择当今最有效的方法方面做得相当不错


警告:我还没有在select sa_id中设置表和数据来测试这些

s.sa_id。。谢谢@Prdp这是一个括号问题,应该用括号!不仅仅是括号。在中使用时,不能选择多个列。在子菜单中单独选择sa_idquery@LiamC-下面有三个可能的答案。如果有人回答了您的问题,您可以将该答案标记为正确答案。@user7294900谢谢。我需要用括号而不是括号!它可以更快,但这取决于两个表之间的相对基数。很好地解释了这一点,我同意。