【问题标题】:OUTER JOIN with SQL across multiple tables in SQL Server 2008SQL Server 2008 中跨多个表的 SQL OUTER JOIN
【发布时间】:2012-05-22 00:06:40
【问题描述】:

我有一个 SQL Server 2008 数据库。这个数据库有三个表:

人物

  - Id
  - FullName
  - MembershipStatusId (nullable)
  - HairStyleId (nullable)

会员状态

  - Id
  - Name

发型

  - Id
  - ColorName
  - Description

我需要创建一个查询来列出我数据库中的所有人员。因为MembershipStatusIdHairStyleId 都可以为空,所以我知道我需要进行左外连接。但是,因为有多个表,我不知道该怎么做。通过一个左外连接,我知道我可以做到这一点:

SELECT
  p.*,
  m.Name as 'MembershipStatus',
  -- how do i include the person's hair color as part of my result set?
FROM
  Person p LEFT OUTER JOIN
    MembershipStatus m ON p.[MembershipStatusId]

但是,我不确定如何为发型名称添加左外连接。有人可以告诉我如何包含人的头发颜色吗?

谢谢!

【问题讨论】:

  • 您的两个联接都在主键上,因此根据目前的答案,它相当简单。 (外部联接开始变得棘手,您需要处理两个或更多 X 对多外部联接。)

标签: sql-server-2008 outer-join


【解决方案1】:

您只需执行另一个LEFT JOIN 以包含发型表

SELECT
  p.*,
  m.Name as 'MembershipStatus',
  h.ColorName
FROM Person p 
LEFT JOIN MembershipStatus m 
    ON p.[MembershipStatusId] = m. Id
LEFT JOIN HairStyle h
    ON p.HairStyleId = h.id

SQL Fiddle上查看演示

【讨论】:

  • 如果 MembershipId 为空,但 HairStyleId 不是,会发生什么?它还会起作用吗?在我看来,如果 MembershipStatusId 为空,查询将退出。但是,我可能误会了什么。
  • 因为它是一个外连接,即使它为空,你仍然应该得到结果,我用一个 sql fiddle 演示更新了我的答案
【解决方案2】:

可能是这样的:

SELECT
    Person.id,
    MembershipStatus.Name AS MemberShip,
    HairStyle.ColorName AS HairStyleColorName
FROM
    Person
    LEFT JOIN MembershipStatus
        ON Person.MembershipStatusId=MembershipStatus.Id
    LEFT JOIN HairStyle
        ON Person.HairStyleId = HairStyle.Id

【讨论】:

    猜你喜欢
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多