我有这个存储过程.我的问题是当代理表中不存在记录时不返回任何内容.我想说,即使代理商中没有记录仍然返回,所以我已经为代理商添加了左外部联接,并且_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)
问题出在这里:
...
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,但是您要求的_IsActive是1,对于左连接,这不是真的.
将该条件移动到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)
现在条件将适用于匹配的行,或者如果没有匹配的行,您将获得全零行.