You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 18:54:25