2010-08-02 3 views
2

Когда я запускаю простой оператор SELECT в этой таблице, я возвращаю строку (это правильно, должно быть только одно). Вот что ЗЕЬЕСТ:SQL Хранимая процедура не возвращает никаких данных

select * from Lending.HMDA where BatchId = 1 

Вот прок я выполнения, который не возвращает ни одной строки:

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' 

Почему прок не возвращает данные? Каким может быть возможный сценарий, в котором это произойдет?

+0

Вы должны опубликовать тестовые данные, если вы ищете окончательный ответ или, возможно, решение (хотя ответы Andomar и Phillip хорошие). – Unreason

+1

Должен сказать, что моделирование данных для использования одной таблицы поиска для разных типов данных вызывает все виды боли (ссылочная целостность, структурная жесткость, фиксированные типы и ширина и т. Д.). Вы должны разделить это на отдельные таблицы. По крайней мере, вы должны создавать представления для 'PropertyType',' LoanPurpose', 'State',' County' и т. Д. –

ответ

3

Возможные сценарии:

  • Нет строк, где H.BatchId = 1 AND H.IsExclueded <> «Правда '
  • нет соответствующих строк в таблице Применение
  • нет соответствующих строк в таблице займа
  • нет соответствующих строк в tblLookup для PropertyTypeId
  • соответствующих строк я п 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

inner join возвращает только строку, если соответствует состоянию on. Попробуйте изменить их все на left outer join и посмотреть, есть ли у вас какие-либо строки.

В left join столбец таблицы будет null, когда условие on не соответствует. Это, как правило, быстрый способ найти нарушающую таблицу.

+1

Ну, я хочу, чтобы все столбцы были возвращены независимо от того, есть ли у них данные. Что я буду использовать для этого? Просто «ПРИСОЕДИНЯЙТЕСЬ»? – Scott

+1

Нет, «левое соединение» или «левое внешнее соединение». –

+1

Левое объединение возвращает null для столбцов из таблицы на «правой стороне» соединения. Поэтому я тоже считаю, что левое соединение - это то, что вы ищете. –

0

Очевидно, что ваш первый запрос и второй запрос являются мирами друг от друга. Во втором запросе со всеми этими внутренними соединениями требуется, чтобы строка в Lending.HDMA (и имела IsExcluded <> 'True', который является критерием, который не существует в первом запросе) и имеет соответствующую строку в других таблицах запроса. , Если вы ищете таблицу, которая отфильтровывает результаты, я бы прокомментировал все соединения и один за другим раскомментировал соединение и выполнил запрос, чтобы узнать, есть ли у вас строки. (Очевидно, что вам нужно будет временно изменить Выберите пункт, чтобы что-то вроде Select *, чтобы сделать это.)

1

Вы уверены, что всегда есть случай, когда H.BatchId = 1 и H.IsExcluded <> «Правда»? Если нет, это может сделать это.

+0

Так что он не возвращается из-за обоих внешних внешних связей и этого сравнения. Однако сравнение должно быть правдой, но это не так. Значение в таблице для этого значения теперь «False». Нужно ли сравнивать его как 0/1 для бит-поля? – Scott

+0

Я бы подумал, что если значение «False», то значение переменной H.IsExcluded <> «True» будет равно true. Тем не менее, это не помешает сделать сравнение 0/1 и посмотреть, будет ли это лучше для вас –

1

Не зная о вашей базе данных, сказать сложно. Но я подозреваю, что одно из этих объединений ID не возвращает строку. Если вы замените эти соединения на подзапросы, было бы легче увидеть, кто из них виновен.

Например ...

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

Быстрый способ увидеть, где строка исчезает может быть, чтобы выполнить запрос с параметром «Включить фактический план выполнения» включен и иметь быстрый мыши над стрелками чтобы увидеть, где число строк становится равным нулю.

Смежные вопросы