能否在单条SQL语句中使用父查询字段值作为动态表名实现关联查询
实现方案
可以通过纯静态SQL实现该需求,完全符合视图使用、支持第三方编辑的要求,目前有两种兼容绝大多数主流数据库的实现方案:
方案1:LEFT JOIN 关联所有可选部门表(更推荐)
该方案逻辑清晰、性能稳定,后续扩展字段成本低,适合表数量较少的场景(你提到只有3个可选表完全适用):
SELECT doc.[DOC ID], doc.[PO Number], doc.[Supplier Coder], doc.[APPROVER DEPT], COALESCE(d1.Approver, d2.Approver, d3.Approver) AS Approver FROM documents doc LEFT JOIN DEPT1 d1 ON doc.[APPROVER DEPT] = 1 AND d1.[DOC ID] = doc.[DOC ID] LEFT JOIN DEPT2 d2 ON doc.[APPROVER DEPT] = 2 AND d2.[DOC ID] = doc.[DOC ID] LEFT JOIN DEPT3 d3 ON doc.[APPROVER DEPT] = 3 AND d3.[DOC ID] = doc.[DOC ID]
实现逻辑:仅当文档对应部门编号匹配时,才会关联对应部门表,最后通过COALESCE函数返回非空的审批人值。给所有DEPT表的DOC ID字段建索引后,查询性能会非常高。
方案2:CASE 分支子查询
如果只需要从部门表取单个字段,也可以用CASE判断分支的写法:
SELECT doc.[DOC ID], doc.[PO Number], doc.[Supplier Coder], doc.[APPROVER DEPT], CASE doc.[APPROVER DEPT] WHEN 1 THEN (SELECT Approver FROM DEPT1 WHERE [DOC ID] = doc.[DOC ID]) WHEN 2 THEN (SELECT Approver FROM DEPT2 WHERE [DOC ID] = doc.[DOC ID]) WHEN 3 THEN (SELECT Approver FROM DEPT3 WHERE [DOC ID] = doc.[DOC ID]) END AS Approver FROM documents doc
注意事项
不要使用动态拼接SQL的方案(比如通过EXEC执行拼接字符串),这类方案无法创建视图,还存在SQL注入风险,也不支持第三方直接编辑维护。如果后续新增部门表,只需在上述方案中对应增加关联分支即可,维护成本很低。
内容的提问来源于stack exchange,提问作者Morgan
相关产品推荐
相关产品推荐

