ВНЕШНЕЕ СОЕДИНЕНИЕ с SQL для нескольких таблиц в SQL Server 2008

У меня есть база данных SQL Server 2008. Эта база данных имеет три таблицы:

Человек

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

Статус участия

  - Id
  - Name

Прическа

  - Id
  - ColorName
  - Description

Мне нужно создать запрос, который перечисляет всех людей в моей базе данных. Поскольку MembershipStatusId и HairStyleId оба допускают значение NULL, я знаю, что мне нужно выполнить левое внешнее соединение. Однако, поскольку есть несколько таблиц, я не уверен, как это сделать. С одним левым внешним соединением я знаю, что могу сделать это:

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]

Однако я не уверен, как добавить левое внешнее соединение для имени прически. Может кто-нибудь, пожалуйста, скажите мне, как включить цвет волос человека?

Благодарю вас!


person JavaScript Developer    schedule 14.05.2012    source источник
comment
Оба ваших соединения находятся на первичных ключах, поэтому, судя по ответам, это довольно просто. (Внешние соединения начинают становиться сложными, если вам приходится иметь дело с двумя или более внешними соединениями X-to-many.)   -  person Philip Kelley    schedule 14.05.2012


Ответы (2)


Вы просто делаете еще одно LEFT JOIN, чтобы включить таблицу HairStyle.

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.

person Taryn    schedule 14.05.2012
comment
Что произойдет, если MembershipId имеет значение null, а HairStyleId — нет? Будет ли это работать? На мой взгляд, запрос завершился бы, если бы MembershipStatusId был нулевым. Но, может, я чего-то не понимаю. - person JavaScript Developer; 14.05.2012
comment
Поскольку это внешнее соединение, вы все равно должны получить результат, даже если он равен нулю, я обновил свой ответ демонстрацией скрипки sql. - person Taryn; 14.05.2012

Может быть, что-то вроде этого:

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
person Arion    schedule 14.05.2012