新手到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结束查询并且没有任何运气。
任何帮助非常感谢
答案 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
);