连接三张表获取匹配与不匹配数据,显示全部部门含无发票项
问题解决:查询所有部门及对应发票金额(含无发票部门)
原查询的问题
- 使用
CROSS JOIN会生成INVOICE和DEPARTMENT的笛卡尔积,直接导致大量重复数据 - 连接顺序错误,没有以
DEPARTMENT作为主表,无法保留无对应发票的部门(比如HRA)
正确SQL语句
SELECT D.DEP_NAME, I.SPENT FROM DEPARTMENT D LEFT JOIN ROLES R ON D.DEP_ID = R.DEPARTMENT_ID LEFT JOIN INVOICE I ON R.ROLE_ID = I.ROLEID ORDER BY D.DEP_NAME;
逻辑说明
- 以
DEPARTMENT表作为查询起点,确保所有部门都会被返回 - 左连接
ROLES表,通过部门ID关联,即使部门没有对应角色,也会保留该部门行 - 再左连接
INVOICE表,通过角色ID关联,无对应发票的部门,SPENT字段会自动显示NULL - 最后按部门名称排序,完全匹配期望输出
执行结果
DEP_NAME | SPENT ----------------|------ ACCOUNTING | 500 CUSTOMER_SERVICE | 400 HRA | NULL
内容的提问来源于stack exchange,提问作者Pechiyappan Raj
相关产品推荐
相关产品推荐

