又一个加入问题

时间:2009-09-21 21:30:46

标签: sql sql-server join

我想撤回有关贷款的信息。一条信息是一定的费用金额。如果我将查询简化为贷款数量和费用金额,我仍然无法弄清楚。第一个查询返回我期望的,一个贷款号码和一个0的费用金额(费用没有应用),而第二个查询我不能为爱情或金钱工作。无论我尝试应用什么类型的连接,它都只返回空结果集。如果有所不同,请使用SQL Server 2005 谢谢你的时间。

欢呼鲍勃

select 
  tblLoan.loanID as LoanNumber
 ,isnull(tblgfe1300.gfe1300feeTot,0) as RepairFunds
from
  tblLoan
LEFT JOIN tblgfe1300 on tblgfe1300.loanID = tblLoan.loanID AND tblgfe1300.gfe1300FeeName = 'Escrow Holdback'
WHERE tblLoan.loanID = '3250000167'

现在这是不起作用的。

select 
  tblLoan.loanID as LoanNumber
  ,isnull(tblgfe1300.gfe1300feeTot,0) as RepairFunds
from
  tblLoan
  LEFT JOIN tblgfe1300 on  tblgfe1300.loanID = tblLoan.loanID
where
  tblLoan.loanID = '3250000167'
  AND tblgfe1300.gfe1300FeeName = 'Escrow Holdback'

3 个答案:

答案 0 :(得分:1)

我相信在表tblgfe1300中,你没有指定ID和feename =“escrow holdback”的记录。

第一个查询返回结果的原因是,您在gfe1300FeeName collumn上的条件发生在'jointime',并且由于您正在使用左连接,因此所有结果都将包含在结果集中。 之后,结果集将在Id上过滤,并且不再考虑gfe1300FeeName列。

在第二个查询中,在应用连接后会考虑第二列。 因此,如果您有一条指定Id的记录,但gfe1300FeeName列中的值不是'Escrow Holdback',那么该记录将被排除在结果集之外。

答案 1 :(得分:0)

如果联接无效,则结果中仍有tbl.loanID。但是,如果您使用WHERE进行过滤,那么您就没有结果。

您可以通过在第一个查询中添加WHERE tblgfe1300.gfe1300FeeName = 'Escrow Holdback'来验证这一点,然后您也无法获得任何内容。

答案 2 :(得分:0)

此查询:

select L.loanID LoanNumber, 
   isnull(F.gfe1300feeTot, 0) RepairFunds
from tblLoan L 
   LEFT JOIN tblgfe1300 F
      on F.loanID = L.loanID
where L.loanID = '3250000167'  
    AND F.gfe1300FeeName = 'Escrow Holdback'

不返回任何行,因为F.gfe1300FeeName表达式位于Where子句中而不是Join中。

使用外连接时,应用连接条件(但没有行匹配),然后是外连接内侧的所有行,但在'外部'的表中没有匹配的行side被添加回来,但是对于应该来自外表中[不存在]行的所有列的NULL值。然后,(因为您正在对此外表tblgfe1300中的列进行过滤),您的Where子句会过滤掉那些行,因为那里的值(NULL)不等于'Escrow Holdback'