2010-07-14 66 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

相關問題