我正在使用asp.net中的Web应用程序,我正在使用VS Community 2015提供的SQL来创建和管理数据库。
在某些时候,我想要返回一个表中的所有条目,并将其与另一个可以具有完全空记录的表连接。后一个表格填充了用户在与网站交互时输入的数据。
但是,我的存储过程只提取我希望它获取的四行中的一行来获取我的记录。当我测试我的代码时,我习惯只使用一个配置文件,它按预期工作。这对我来说很奇怪......你有什么想法为什么会这样?
<cfhttp url="https://www.google.com/accounts/ClientLogin" method="post" result="result" charset="utf-8">
<cfhttpparam type="formfield" name="accountType" value="HOSTED_OR_GOOGLE">
<cfhttpparam type="formfield" name="Email" value="<gmail id>">
<cfhttpparam type="formfield" name="Passwd" value="<password>">
<cfhttpparam type="formfield" name="service" value="youtube">
<cfhttpparam type="formfield" name="source" value="youtubecode">
</cfhttp>
所以在这里,当我运行create proc UserProfile
@email varchar(100)
as
begin
select * from TabelNume where email = @email
declare @moduleID int
declare @participantID int
select @moduleID = Session_Fk from TabelNume where email=@email
select @participantID = id from TabelNume where email=@email
select * from Modules where Id = @moduleID;
select * from Meetings left outer join Scales on Meetings.Id = Scales.Meeting_FK
where Meetings.Module_FK = @moduleID and (Participants_FK = @participantID or Participants_FK is null)
end
时,它为我的连接检索了4行。
然而,当我运行spUserProfile 'unu@unu.com'
时,它只获取1行。此行是sp中指定的spUserProfile 'doi@doi.com'
的最后一个条目。任何帮助表示赞赏!谢谢!
答案 0 :(得分:0)
您需要将条件放在where
子句而不是select *
from Meetings left outer join
Scales
on Meetings.Id = Scales.Meeting_FK
where Meetings.Module_FK = @moduleID and
(Participants_FK = @participantID or Participants_FK is null)
子句中。这是您的查询:
select *
from Meetings left outer join
Scales
on Meetings.Id = Scales.Meeting_FK and
Participants_FK = @participantID
where Meetings.Module_FK = @moduleID;
这应该是:
where
为什么它们不相同?嗯,这有点难以解释。第一个版本似乎应该做你想要的。但是,问题在于会议中的任何参与者都不是您关心的参与者。然后,您的Participants_FK = @participantID
子句失败。 Participants_FK is null
失败,因为参与者不匹配。 Meetings
失败,因为该列始终具有值 - 只是不匹配的值。
因此,您的查询将获得没有参与者的会议或与您的参与者ID会面;它会过滤掉其他所有内容。
最后,如果您只想了解EXISTS
的相关信息,那么您应该使用LEFT JOIN
代替{{1}}。