SQL子查询中如何选取多列?附现有查询代码求解答
报错原因
你写的关联子查询属于标量子查询,这类子查询仅支持返回单行单列的单个值,没法同时返回两列数据;同时你把子查询的别名和字段名写在了子查询括号外面,语法本身就不合法,所以语句无法运行。
正确实现方式
方案1:使用JOIN关联(推荐,性能最优、可读性最好)
直接把角色映射表、角色表和主查询的表做关联,不需要写嵌套子查询,是最常规的写法:
SELECT i.ind_first_name, i.ind_last_name, i.ind_email, i.ind_domain, u.uom_start_date, u.uom_end_date, u.uom_active, ar.arl_id, ar.arl_name FROM individual i INNER JOIN user_organization_mapping u ON i.ind_id = u.uom_ind_id LEFT JOIN role_individual_mapping rim ON rim.rim_ind_id = u.uom_ind_id AND rim.rim_org_id = u.uom_org_id AND rim.rim_active = 'Y' LEFT JOIN application_role ar ON ar.arl_id = rim.rim_arl_id AND ar.arl_active = 'Y' WHERE u.uom_ind_id = '5b58bdfc-ae5c-4a19-b742-eef3c879c835' AND u.uom_org_id = 'c3cd6a0f-7c97-4422-8617-153ee31d8832';
说明:这里给表加了短别名简化写法,用显式JOIN代替原来的逗号隐式关联,逻辑更清晰。如果匹配到多个活跃角色,这条语句会返回多行对应用户的多个角色,符合一对多的业务数据逻辑。如果业务上确定一个用户在对应组织下只有1个活跃角色,返回结果不会有重复行。
方案2:拆分为两个独立的标量子查询(仅确认子查询最多返回1行时可用)
如果你坚持要用子查询写法,需要把取两列的逻辑拆成两个单独的标量子查询,每个子查询只返回一个字段:
SELECT ind_first_name, ind_last_name, ind_email, ind_domain, uom_start_date, uom_end_date, uom_active, ( SELECT arl_id FROM application_role INNER JOIN role_individual_mapping ON arl_id = rim_arl_id WHERE rim_ind_id = uom_ind_id AND rim_org_id = uom_org_id AND rim_active = 'Y' AND arl_active = 'Y' LIMIT 1 ) AS arl_id, ( SELECT arl_name FROM application_role INNER JOIN role_individual_mapping ON arl_id = rim_arl_id WHERE rim_ind_id = uom_ind_id AND rim_org_id = uom_org_id AND rim_active = 'Y' AND arl_active = 'Y' LIMIT 1 ) AS arl_name FROM individual, user_organization_mapping WHERE uom_ind_id = '5b58bdfc-ae5c-4a19-b742-eef3c879c835' AND uom_org_id = 'c3cd6a0f-7c97-4422-8617-153ee31d8832' AND ind_id = uom_ind_id;
注意:这种写法两个子查询要分别扫一遍关联表,性能比JOIN写法差,而且如果子查询匹配到多行数据会直接报错,所以必须加
LIMIT 1兜底,仅适合小数据量、确认关联关系为1对1的场景使用。
内容的提问来源于stack exchange,提问作者Benezir
相关产品推荐
相关产品推荐

