SQL Server Compact:Left Join仅返回一行FOR MOST条目

时间:2015-09-29 15:51:20

标签: sql sql-server

我正在使用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'的最后一个条目。任何帮助表示赞赏!谢谢!

1 个答案:

答案 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}}。