如何在子查询中使用父查询选中的ID?含CASE语句场景
嘿,我注意到你写的示例里有个小坑——SELECT里定义的别名"ID_P"在子查询的WHERE子句里是用不了的,因为SQL的执行顺序里,WHERE阶段比SELECT阶段早,这时候别名还没生效呢。我来给你修正一下,同时给几个更合理的写法:
基础修正版(贴近你的需求)
用相关子查询(依赖父查询每行数据的子查询),直接引用父表的原字段或者给父表加别名来关联,避免使用SELECT阶段的别名:
SELECT "OFF_ID" AS "ID_P", CASE WHEN ( SELECT COUNT("OFF_NUMBER") FROM "OFFER_COPY" WHERE "OFF_C_ID" = "OFFER"."OFF_ID" -- 直接用父表原列,别用SELECT别名 ) > 0 THEN 'JOHN' ELSE 'DOE' END AS "TEST" FROM "OFFER"
给父表加个别名会让关联逻辑更清晰,可读性更高:
SELECT o."OFF_ID" AS "ID_P", CASE WHEN ( SELECT COUNT(oc."OFF_NUMBER") FROM "OFFER_COPY" oc WHERE oc."OFF_C_ID" = o."OFF_ID" -- 用父表别名o关联,一目了然 ) > 0 THEN 'JOHN' ELSE 'DOE' END AS "TEST" FROM "OFFER" o
性能优化版
如果只是判断是否存在匹配记录,用EXISTS比COUNT更高效——因为EXISTS只要找到第一条匹配的记录就会停止查询,不用统计所有数量:
SELECT o."OFF_ID" AS "ID_P", CASE WHEN EXISTS ( SELECT 1 -- 这里选1就行,不用实际字段 FROM "OFFER_COPY" oc WHERE oc."OFF_C_ID" = o."OFF_ID" ) THEN 'JOHN' ELSE 'DOE' END AS "TEST" FROM "OFFER" o
大数据量场景优化
如果数据量较大,相关子查询可能会变慢,改成LEFT JOIN的方式性能会更好:
SELECT DISTINCT o."OFF_ID" AS "ID_P", CASE WHEN oc."OFF_C_ID" IS NOT NULL THEN 'JOHN' ELSE 'DOE' END AS "TEST" FROM "OFFER" o LEFT JOIN "OFFER_COPY" oc ON oc."OFF_C_ID" = o."OFF_ID"
这里的DISTINCT是为了避免父表的一行在子表有多个匹配时重复输出,如果你确定子表每个OFF_C_ID只对应一条记录,可以去掉。
核心要点提醒
子查询里绝对不能引用SELECT子句的别名,必须用原表字段或者表别名.字段的方式来关联父查询的ID,这样才能让子查询正确匹配父查询的每一行数据。
内容的提问来源于stack exchange,提问作者naspy971
相关产品推荐
相关产品推荐

