ПРИСОЕДИНЯЙТЕСЬ, потянув в 2 раза больше строк, чем ожидалось - PullRequest
0 голосов
/ 13 мая 2019

У меня есть 3 таблицы - Таблица tblFactorDefinition, tblFamily и tblConstituent.

  • В tblFactorDefinition есть FamilyID с соответствующими факторами в столбце FieldName (а именно Factor1, Factor2, ..... Factor9)
  • Таблица tblConstituent имеет ассоциированное значение Factors (значение для Factor1, Factor2, .. Factor9, если оно существует) для каждого компонента внутри Family и может быть объединено FamilyID с FamilyID в tbLFacctorDefinition.
  • Таблица tblFamily имеет Семейные детали.(т.е. FamilyTypeID = 1 является индексом или FamilyTypeID = 2 является ETF).

При попытке получить FamilyID с факторами, соответствующими значениям Factors в tblConstituent, я получаю в 2-3 раза больше строк.Например, FamilyID = 10216 имеет 27975 компонентов, но мой запрос выбирает более 55k + строк.Я дошел до стены, пытаясь выяснить, JOIN.

SELECT DISTINCT tc.FamilyID, 
                tfd.FieldName, 
                tc.Factor1, 
                tc.Factor2, 
                tc.Factor3, 
                tc.Factor4, 
                tc.Factor5, 
                tc.Factor6, 
                tc.Factor7, 
                tc.Factor8, 
                tc.Factor9, 
                tf.OpenDate 
FROM   soladbserver..tblFamily tf 
       JOIN soladbserver..tblFactorDefinition tfd 
         ON tfd.FamilyID = tf.FamilyID 
       JOIN soladbserver..tblConstituent tc 
         ON tc.FamilyID = tf.FamilyID 
            AND tc.StartDate <= Getdate() 
            AND tc.EndDate > Getdate() 
WHERE  tf.OpenDate = Cast(Getdate() AS DATE) 
       AND tf.FamilyTypeID = 1 
       AND tf.DataProviderID = 2 
       AND tf.FamilyID IN ( 10216 ) 

Я ожидаю 27975 строк со значениями коэффициентов для сопоставления FieldName Factor1, Factor2, ..., Factor9), учитывая, что все имеют значения.

tblConstituent

tblFactorDefinition

tblFamily tblFamilytblFamiliy

Снимок экрана 1 представляет собой таблицу tblConstitution, Secreenshot 2 представляет собой таблицу tblFactorDefinition, снимок экрана 3,4,5 представляет собой таблицу tblFamily:

1 Ответ

0 голосов
/ 13 мая 2019

Измените соединение на «Left Outer Join» и используйте оператор выбора подзапроса sql, чтобы получить имя поля и посмотреть, что вы получите. Если FamilyID является первичным ключом в таблице tc и внешним ключом в других, это должно привести вас туда, где вы хотите быть.

SELECT tf.FamilyID, 
            (Select top 1 isNull(tfd.FieldName,'') from soladbserver..tblFactorDefinition tfd 
     where tfd.FamilyID = tf.FamilyID ) as FieldName, -- this assumes each familyID only has one tfd.FieldName -- if not change both to left outer joins and leave the rest as is and run it
            tc.Factor1, 
            tc.Factor2, 
            tc.Factor3, 
            tc.Factor4, 
            tc.Factor5, 
            tc.Factor6, 
            tc.Factor7, 
            tc.Factor8, 
            tc.Factor9, 
            tf.OpenDate 
FROM   soladbserver..tblFamily tf 
  left outer JOIN soladbserver..tblConstituent tc 
     ON tc.FamilyID = tf.FamilyID 
        AND tc.StartDate <= Getdate() 
        AND tc.EndDate > Getdate() 
WHERE  tf.OpenDate = Cast(Getdate() AS DATE) 
   AND tf.FamilyTypeID = 1 
   AND tf.DataProviderID = 2 
   AND tf.FamilyID IN ( 10216 ) 
...