多表SQL查询技术求助:如何关联Account与User表获取user_name并筛选非活跃账户
正确的SQL查询解决方案
首先,咱们来梳理你原查询语句里的几个核心问题:
- 没添加Account和User表的关联条件,这就是你拿不到
user_name的根本原因 - 字段引用错误:
Sub_Contract_ID.basic_con_id.start_date是无效写法,start_date是Sub_Contract_ID的直接字段,应该写成Sub_Contract_ID.start_date - 用了中文双引号
“Inactive”,SQL语法要求用英文双引号或单引号 - 采用了旧的逗号分隔表的写法,推荐用显式
JOIN语法,可读性和维护性更强
下面是修正后的查询语句,分两种常见场景给出:
场景1:所有标记为Inactive的Account都有对应的User记录(用INNER JOIN)
SELECT Account.acc_id, Account.acc_name, Account.acc_status, User.user_name, Sub_Contract_ID.basic_con_id, Sub_Contract_ID.start_date, Sub_Contract_ID.end_date FROM Account INNER JOIN User ON Account.acc_owner_id = User.role_id INNER JOIN Sub_Contract_ID -- 注意:你没说明Account和Sub_Contract_ID的关联关系! -- 请替换成实际业务的关联条件,比如假设是Account.acc_id = Sub_Contract_ID.acc_id(示例) ON Account.acc_id = Sub_Contract_ID.acc_id WHERE Account.acc_status = 'Inactive';
场景2:即使Inactive的Account没有对应的User记录,也要保留该Account数据(用LEFT JOIN)
SELECT Account.acc_id, Account.acc_name, Account.acc_status, User.user_name, -- 无对应User时该字段会显示NULL Sub_Contract_ID.basic_con_id, Sub_Contract_ID.start_date, Sub_Contract_ID.end_date FROM Account LEFT JOIN User ON Account.acc_owner_id = User.role_id LEFT JOIN Sub_Contract_ID -- 同样需要替换成实际的Account与Sub_Contract_ID关联条件 ON Account.acc_id = Sub_Contract_ID.acc_id WHERE Account.acc_status = 'Inactive';
关键提醒:
你提供的表结构里没说明Account和Sub_Contract_ID之间的关联关系,上面示例里我假设了Account.acc_id = Sub_Contract_ID.acc_id作为连接条件,一定要根据你的实际业务逻辑替换成正确的关联字段哦!
内容的提问来源于stack exchange,提问作者user13024918
相关产品推荐
相关产品推荐

