2010-08-02 84 views
2

当我在这个表上运行一个简单的SELECT语句时,我得到一个行(这是正确的应该只有一个)。下面是SELECT语句:SQL存储过程不返回任何数据

select * from Lending.HMDA where BatchId = 1 

这里是我执行PROC,这不返回行:

DECLARE @BatchStartDate datetime, @BatchEndDate datetime 

    SELECT @BatchStartDate = StartDate, @BatchEndDate = EndDate FROM Lending.HMDAReportBatch WHERE BatchId = 1 

    -- HMDA And App Data 
    SELECT 
    A.ApplicationId, 
    A.CreatedDate, 
    LU14.LookupCode AS LoanTypeId, 
    LU1.LookupCode AS PropertyTypeId, 
    LU2.LookupCode AS LoanPurposeId, 
    LU3.LookupCode AS OwnerOccupancyId, 
    L.FinalLoanAmount, 
    LU4.LookupCode AS PreApprovalId, 
    LU5.LookupCode AS ActionId, 
    A.ActionDate, 
    H.MSA, 
    LU6.MiscCode1 AS StateId, 
    LU7.LookupCode AS CountyId, 
    H.CensusTract, 
    LU8.LookupCode AS ApplicantEthnicityId, 
    LU9.LookupCode AS JointEthnicityId, 
    H.IsApplicantRaceAmericanIndian, 
    H.IsApplicantRaceAsian, 
    H.IsApplicantRaceBlack, 
    H.IsApplicantRaceIslander, 
    H.IsApplicantRaceNA, 
    H.IsApplicantRaceNotProvided, 
    H.IsApplicantRaceWhite, 
    H.IsJointRaceAmericanIndian, 
    H.IsJointRaceAsian, 
    H.IsJointRaceBlack, 
    H.IsJointRaceIslander, 
    H.IsJointRaceNA, 
    H.IsJointRaceNotProvided, 
    H.IsJointRaceWhite, 
    LU10.LookupCode AS ApplicantGenderId, 
    LU11.LookupCode AS JointGenderId, 
    LU12.LookupCode AS LoanPurchaserId, 
    H.IsDenialReasonCash, 
    H.IsDenialReasonCollateral, 
    H.IsDenialReasonCreditHistory, 
    H.IsDenialReasonDTI, 
    H.IsDenialReasonEmploymentHistory, 
    H.IsDenialReasonIncomplete, 
    H.IsDenialReasonInverifiableInfo, 
    H.IsDenialReasonMortgageInsuranceDenied, 
    H.IsDenialReasonOther, 
    H.RateSpread, 
    H.IsHOEPA, 
    LU13.LookupCode AS LienStatusId 
    [email protected] AS BatchStartDate, 
    [email protected] AS BatchEndDate 
    FROM Lending.HMDA H 
    INNER JOIN Lending.Application A ON H.ApplicationId = A.ApplicationId 
    INNER JOIN Lending.Loan L ON H.ApplicationId = L.ApplicationId 
    INNER JOIN tblLookup AS LU1 ON H.PropertyTypeId = LU1.LookupID 
    INNER JOIN tblLookup AS LU2 ON H.LoanPurposeId = LU2.LookupID 
    INNER JOIN tblLookup AS LU3 ON H.OwnerOccupancyId = LU3.LookupID 
    INNER JOIN tblLookup AS LU4 ON H.PreApprovalId = LU4.LookupID 
    INNER JOIN tblLookup AS LU5 ON H.ActionId = LU5.LookupID 
    INNER JOIN tblLookup AS LU6 ON H.StateId = LU6.LookupID 
    INNER JOIN tblLookup AS LU7 ON H.CountyId = LU7.LookupID 
    INNER JOIN tblLookup AS LU8 ON H.ApplicantEthnicityId = LU8.LookupID 
    INNER JOIN tblLookup AS LU9 ON H.JointEthnicityId = LU9.LookupID 
    INNER JOIN tblLookup AS LU10 ON H.ApplicantGenderId = LU10.LookupID 
    INNER JOIN tblLookup AS LU11 ON H.JointGenderId = LU11.LookupID 
    INNER JOIN tblLookup AS LU12 ON H.LoanPurchaserId = LU12.LookupID 
    INNER JOIN tblLookup AS LU13 ON H.LienStatusId = LU13.LookupID 
    INNER JOIN tblLookup AS LU14 ON H.LoanTypeId = LU14.LookupID 

    WHERE H.BatchId = 1 AND H.IsExcluded <> 'True' 

为什么PROC不返回任何数据?这可能会发生什么情况?

+0

如果你正在寻找最终答案或可能的解决方案(尽管Andomar和Phillip的答案都很好),你应该发布测试数据。 – Unreason 2010-08-02 13:40:13

+1

我必须说,对各种数据类型使用单个查找表的数据建模会引起各种各样的痛苦(参照完整性,结构刚性,固定类型和宽度等)。你应该把它分解到单个表中。至少你应该为'PropertyType','LoanPurpose','State','County'等创建视图。 – 2010-08-02 13:42:45

回答

3

可能的情景:

  • 没有行,其中H.BatchId = 1 AND H.IsExclueded <>“真“
  • 表申请没有匹配行
  • 表贷款没有匹配行
  • 在tblLookup没有匹配的行为PropertyTypeId
  • 没有匹配的i行ñtblLookup为LoanPurposeId
  • 在tblLookup没有匹配的行为OwnderOccupancyId
  • 没有匹配行中tblLookup为OreApprovalId
  • 在tblLookup没有匹配的行为ActionUId
  • 没有匹配行中tblLookup为STATEID
  • 没有匹配的行在tblLookup为CountyId
  • 在tblLookup没有匹配的行为ApplicantEthnicityId在tblLookup
  • 没有匹配行的JointEthnicityId
  • 在tblLookup没有匹配的行为ApplicantGenderId
  • 在tblLookup没有匹配的行为JointGenderId
  • 在tblLookup没有匹配的行为LoadPurchaserId
  • 在tblLookup没有匹配的行为LienStatusId
  • 在tblLookup没有匹配行的LoanTypeId
6

如果on条件匹配,则inner join仅返回一行。尝试将它们全部更改为left outer join并查看是否有任何行。

left join中,当on条件无法匹配时,表格的列将为null。这通常是查找违规表的快速方法。

+1

好吧,我想要返回所有列,无论它们是否有数据。我会用什么?只是'加入'? – Scott 2010-08-02 13:32:20

+1

不,“左连接”或“左外连接”。 – 2010-08-02 13:33:37

+1

左连接将在连接的“右侧”的表中为列返回null。所以我也相信一个左连接就是你要找的。 – 2010-08-02 13:35:08

0

显然,你的第一个查询和第二个查询是分开的。在第二个查询中,对于所有这些内部联接,您需要在Lending.HDMA(并且具有IsExcluded <> 'True'这是第一个查询中不存在的条件)中的一行,并在查询中的其他表中具有匹配的行。如果您正在查找过滤结果的表,我会评论所有连接,并逐个取消注释连接并执行查询以查看是否获取行。 (显然,你需要选择条款暂时更改为类似Select *做到这一点。)

1

你是否肯定存在H.BatchId = 1和H.已排除<>'真'?如果没有,那可以做到。

+0

所以它不会因为左外连接和这个比较而返回。比较应该是真的,但事实并非如此。表中该值的值现在为'False'。我必须将它作为0/1作为比特字段进行比较吗? – Scott 2010-08-02 13:42:55

+0

我想如果这个值是'False',那么H.IsExcluded <>'True'会评估为true。尽管如此,做一个0/1比较并且看看它是否对你更好 – 2010-08-02 14:34:18

1

没有任何有关数据库的知识,很难说。但我会怀疑其中一个Id连接没有返回一行。如果用子查询替换这些连接,可以更容易地看出哪一个是罪魁祸首。

例如...

SELECT 
    A.ApplicationId, 
    A.CreatedDate, 
    (SELECT LookupCode 
     FROM tblLookup 
     WHERE H.LoanTypeId = LookupCode) AS LoantypeId, 
    ...etc... 
0

看到其中行正在消失可能是启用了“包括实际的执行计划”选项来执行查询,并有一个快速的鼠标箭头的快捷方式查看行数变为零的位置。