【问题标题】:Select Query Joining 3 Tables选择查询连接 3 个表
【发布时间】:2013-04-18 01:49:59
【问题描述】:

我有 3 张桌子

人员:id、姓名
部门:id、姓名
Match_Dept_Per:dept_id、pers_id、workInfo

外键:
dept_id --> Department.id
pers_id --> Personel.id

示例数据:

人员:
1、埃米尔·西瓦斯
2、塞尔坎通凯

部门:
1、销售
2、规划

Match_Dept_Per:
1,1,经理

我想要做的是,列出人名、部门名称和工作信息,例如:

ID | Pers. Name | Dept Name | Work Info
---------------------------------------
1  | Emir Civas | Sales     | Manager

我可以通过一个简单的选择查询来做到这一点:

select p.id, p.name, d.name, m.workInfo
  from personel p, department d, match_dept_per m
 where p.id = m.pers_id and d.id = m.dept_id;

这是我的架构和此查询的sample fiddle

但是,我需要显示其他人的 ID 未插入到 match_dept_per 表中。并将“未知”设置为空值。喜欢:

ID | Pers. Name    | Dept Name | Work Info
------------------------------------------
1  | Emir Civas    | Sales     | Manager
2  | Sercan Tuncay | Unknown   | Unknown

由于我使用的是 Match_Dept_Per 表,如果不添加 Personel ID,我将无能为力。

有什么建议吗?

【问题讨论】:

  • 我相信您需要将 ISNULL() 函数合并为 SQL 语句的一部分。 ISNULL ( check_expression , replacement_value ) 所以这将允许您用 UNKNOWN 替换检查为 null 的值。我不会发布答案,因为我没有时间重写您的查询。

标签: sql sql-server sql-server-2008 select join


【解决方案1】:

使用left outer join 包括所有人员,即使他们与其他表没有关联:

select p.id,
       p.name,
       ifnull(d.name, 'Unknown') DepName,
       ifnull(m.workInfo, 'Unknown') workInfo
  from personel p
       left outer join match_dept_per m
           on p.id = m.pers_id
       left outer join department d
           on d.id = m.dept_id

这是demo fiddle

由于您似乎使用 MS SQL,您可能需要使用 isnull() 而不是 ifnull()。但无论如何我都会忽略这一点,因为我认为最好在使用数据的代码中使用NULL(Java、C# 等)。你可以在那里控制输出。

【讨论】:

  • 要完成此答案,请为部门和 match_dept_per 的字段添加 ifnull()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
  • 2013-02-06
  • 2017-09-18
  • 2023-03-20
  • 1970-01-01
  • 2015-06-09
相关资源
最近更新 更多