当SessionId为null时,Null不出现

时间:2013-12-16 02:38:25

标签: sql sql-server

我认为我正在正确地执行以下SQL,但显然不是。我的dbo.AttendeesLedger.SessionId有时为null,并且这些空值永远不会出现在结果中。

SELECT 
  dbo.AttendeesLedger.Id,
  dbo.AttendeesLedger.SessionId,
  dbo.AttendeesLedger.AttendeesId,
  dbo.Attendees.Id,
  dbo.Sessions.Id
FROM
  dbo.AttendeesLedger
  INNER JOIN dbo.Attendees ON (dbo.AttendeesLedger.AttendeesId = dbo.Attendees.Id)
  LEFT OUTER JOIN dbo.Sessions ON (dbo.AttendeesLedger.SessionId = dbo.Sessions.Id)

3 个答案:

答案 0 :(得分:2)

这是整数的已知事物。 0和Null不是一回事 因为您加入其他表,除非您明确说明,否则它不会包含null 它应该

添加“或dbo.AttendeesLedger.SessionId为空”以查看它们。

更多细节: http://www.w3schools.com/sql/sql_null_values.asp

这也可能对您有用(ANSI_NULLS): http://technet.microsoft.com/en-us/library/ms188048.aspx

答案 1 :(得分:0)

您的INNER JOIN很可能会过滤掉这些结果。我的意思是,LEFT JOIN会保留左侧的所有值,但INNER JOIN只会保留那些构成第一个ON条件true的值。每当第一个条件为false时,即使您使用LEFT JOIN,也不会显示这些结果...因为不匹配的值将不再存在。

答案 2 :(得分:0)

此查询中没有任何内容过滤掉会话。所以,你应该得到所有的会议。

我注意到你可以删除最后一个连接;没有必要。如果它是inner join而不是left outer join,则查询将过滤掉NULL会话ID。或者,这可能发生在where子句中。但是您的查询没有过滤任何内容。

您可以将查询简化为:

SELECT al.Id, al.SessionId, al.AttendeesId, a.Id
FROM dbo.AttendeesLedger al INNER JOIN
     dbo.Attendees a
     ON al.AttendeesId = a.Id;