当连接中的一个表没有记录时,Join不返回值

nik*_*kta 1 sql

我有这个存储过程.我的问题是当代理表中不存在记录时不返回任何内容.我想说,即使代理商中没有记录仍然返回,所以我已经为代理商添加了左外部联接,并且_Agency = IsNull(U._Agency,'')在顶部.但仍然没有回报价值.当我拿A._IsActive = 1时,它返回值.在最后一行.我应该怎么做id A._IsActive没有值仍然返回.我尝试了同样的ISNull但没有工作.

declare @Username   VARCHAR(50)
,   @Password   VARCHAR(50)

set @Username = 'admin'
set @Password = 'password2'

SELECT U.Username
 ,_Partner = u.AID
 ,_Agency = IsNull(U._Agency,'')
 , UR._Role
 ,R.Name 
FROM [PartnerPortal].[dbo].[User] AS U
left outer JOIN [PartnerPortal].[dbo].Agency AS A 
  ON U._Agency = A._IdxIdentity 
JOIN [PartnerPortal].[dbo].User_Role AS UR 
  ON U._IdxIdentity = UR._User
JOIN [PartnerPortal].[dbo].[Role] AS R 
  ON UR._Role = R._IdxIdentity
WHERE (Username = @Username)
  AND [Password] =@Password
  AND U._IsActive = 1 
  AND A._IsActive = 1  
  AND UR._IsActive = 1 
  AND R._IsActive = 1
Run Code Online (Sandbox Code Playgroud)

Boh*_*ian 5

问题出在这里:

...
left outer JOIN [PartnerPortal].[dbo].Agency AS A 
    ON U._Agency = A._IdxIdentity 
...
WHERE ... A._IsActive = 1
Run Code Online (Sandbox Code Playgroud)

Agency没有匹配的行时,为该表返回的所有列都是null,但是您要求的_IsActive1,对于左连接,这不是真的.

将该条件移动到ON左连接的条件:

...
left outer JOIN [PartnerPortal].[dbo].Agency AS A 
    ON U._Agency = A._IdxIdentity 
    AND A._IsActive = 1
...
WHERE ... 
Run Code Online (Sandbox Code Playgroud)

现在条件将适用于匹配的行,或者如果没有匹配的行,您将获得全零行.