Будет ли работать объединение, если объединяемый столбец пуст? - PullRequest
1 голос
/ 14 июля 2010

У меня есть эта хранимая процедура, и когда я добавляю соединение, я не получаю результатов. Это потому, что столбец, используемый для условия соединения, ForClientID, имеет значение null? Повлияет ли это на результаты таблицы? Если я выбираю таблицу с Appointment.ForClientID вместо Client.Name, остальная часть таблицы загружается с нулевым столбцом ForClientID. Заранее спасибо, это удивительно полезное сообщество.

Create procedure GetAppointmentsByProfessionalName(@ProfessionalName varchar(256))
as
    declare @ProfessionalID uniqueidentifier
    set @ProfessionalID = (select UserId from aspnet_Users where UserName = @ProfessionalName)

    select  Appointment.AppointmentID as 'Appointment ID', 
            Client.Name as 'Client Name',
            CONVERT(VARCHAR(10),Appointment.ProposedDate,111) as 'Date', 
            CONVERT(CHAR(8), Appointment.ProposedTime, 114)as  'Time', 
            Appointment.ClientDescription as 'Client Notes', 
            Appointment.Confirmed as 'Confirmed Appointment'
    from Appointment join Client on Client.ClientID = Appointment.ForClientID
    where Appointment.ForProfessionalID = @ProfessionalID
go

Ответы [ 2 ]

3 голосов
/ 14 июля 2010

Поведение, окружающее NULL, является основным отличием между различными типами JOIN. Читайте http://en.wikipedia.org/wiki/Join_%28SQL%29, который, будучи Википедией, является удивительно хорошей статьей на эту тему.

2 голосов
/ 15 июля 2010

Вот переписывание с использованием OUTER JOIN для учета возможности Appointment.ForClientID NULL и замены локальной переменной @ProfessionalID на INNER JOIN:

CREATE PROCEDURE GetAppointmentsByProfessionalName
@ProfessionalName VARCHAR(256)
AS
BEGIN

   SELECT Appointment.AppointmentID AS 'Appointment ID', 
          COALESCE(Client.Name, '{{NO CLIENT}}') AS 'Client NAME',
          CONVERT(VARCHAR(10),Appointment.ProposedDate,111) AS 'Date', 
          CONVERT(CHAR(8), Appointment.ProposedTime, 114)AS  'Time', 
          Appointment.ClientDescription AS 'Client Notes', 
          Appointment.Confirmed AS 'Confirmed Appointment'
     FROM Appointment 
          LEFT OUTER JOIN Client 
             ON Client.ClientID = Appointment.ForClientID
          INNER JOIN aspnet_Users
             ON aspnet_Users.UserId = Appointment.ForProfessionalID
    WHERE aspnet_UsersUserName = @ProfessionalName;

END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...