2010-07-14 61 views
1

我有这个存储过程,当我添加连接时,我得不到任何结果。这是因为用于连接条件的列ForClientID是否为空?这会影响表格的结果吗?如果我使用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 
+0

你试过一个LEFT JOIN? – 2010-07-14 02:15:12

+0

为什么不在主查询中'Appointment'和'asp_Users'之间创建一个连接,在'WHERE'子句中使用'@ ProfessionalName'参数并丢失局部变量'@ ProfessionalID'? SQL优化器倾向于更喜欢一个大的查询。 – onedaywhen 2010-07-14 08:02:17

回答

2

下面是使用OUTER JOIN考虑的Appointment.ForClientID的是NULL -able重新写入和与INNER JOIN代替局部变量@ProfessionalID

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; 
3

NULL周围的行为是不同类型的JOIN之间的主要区别。请阅读http://en.wikipedia.org/wiki/Join_%28SQL%29,这篇文章虽然是维基百科,但却是关于这个话题的出色文章。

+0

我用一个左外连接去获得所需的结果。感谢您指点我正确的方向,有用的阅读! – Gallen 2010-07-14 02:13:25

+0

这不是交叉连接,这是SQL-89语法中的标准内连接。我发现笛卡儿产品(即交叉连接)实际上不可能是他想要的。 – Donnie 2010-07-14 02:14:03

相关问题