Oracle PL/SQL子查询需求:实现主查询与关联查询的结合
正确的关联查询实现方法
方法1:使用JOIN(推荐,效率更高)
直接将主查询结果与sdogl表通过提取的20位数字字段关联,同时保留sdogl表的筛选条件:
SELECT h.home_id, h.home_type, h.bathrooms, h.comment, REGEXP_SUBSTR(h.comment, '[0-9]{20}') AS acc, s.gl_id, s.ct FROM homes h LEFT JOIN ( SELECT DISTINCT acc_n, gl_id, ct FROM sdogl WHERE acc_n = '12345678901111472601' ) s ON REGEXP_SUBSTR(h.comment, '[0-9]{20}') = s.acc_n WHERE h.home_id < 500 AND h.home_type = 'two-storey';
如果只需要保留能匹配到sdogl表数据的记录,把LEFT JOIN改成INNER JOIN即可。
方法2:使用关联子查询
如果偏好子查询写法,可采用以下两种方式:
方式A:在SELECT中通过子查询获取对应字段
SELECT h.home_id, h.home_type, h.bathrooms, h.comment, REGEXP_SUBSTR(h.comment, '[0-9]{20}') AS acc, (SELECT gl_id FROM sdogl s WHERE s.acc_n = REGEXP_SUBSTR(h.comment, '[0-9]{20}') AND s.acc_n = '12345678901111472601' LIMIT 1) AS gl_id, (SELECT ct FROM sdogl s WHERE s.acc_n = REGEXP_SUBSTR(h.comment, '[0-9]{20}') AND s.acc_n = '12345678901111472601' LIMIT 1) AS ct FROM homes h WHERE h.home_id < 500 AND h.home_type = 'two-storey';
方式B:用EXISTS筛选匹配记录
SELECT h.home_id, h.home_type, h.bathrooms, h.comment, REGEXP_SUBSTR(h.comment, '[0-9]{20}') AS acc FROM homes h WHERE h.home_id < 500 AND h.home_type = 'two-storey' AND EXISTS ( SELECT 1 FROM sdogl s WHERE s.acc_n = REGEXP_SUBSTR(h.comment, '[0-9]{20}') AND s.acc_n = '12345678901111472601' );
你之前写法错误的原因
你使用的l.acc_n in (SELECT distinct l.acc_n FROM sdogl l)中,子查询的别名l和外部表别名重复,导致子查询里的l.acc_n实际引用的是外部字段,相当于判断字段是否在自身集合里,完全没关联到主查询提取的acc值,逻辑不成立。
内容的提问来源于stack exchange,提问作者Mister_TG
相关产品推荐
相关产品推荐

