Осталось присоединиться к подзапросу - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь выполнить левое соединение в моей главной таблице, используя этот код

select distinct    VBen.BENF_NO_INDIV_BEN_BANLS as benbanls,
                               VBen.BENF_COD_SEXE AS Sexe,
                               VBen.BENF_DAT_NAISS AS DatNaiss,
                               VBen.BENF_DAT_DECES AS DatDec,
                               A.date_ch as date_chsld

from PROD.V_FICH_ID_BEN_CM AS VBen 

left   join  (select distinct VAss.BENF_NO_INDIV_BEN_BANLS as benbanls,
                              vass.BENF_DD_ADMIS_ASSU_MED as date_ch
               from Prod.V_ADMIS_ASSU_MED_PLAN_PRIOR_CM as vass ) as A   

   on VBen.BENF_NO_INDIV_BEN_BANLS =A. benbanls
   where Vben.BENF_DAT_NAISS>'2016-04-01' or Vben.BENF_DAT_DECES>'2011-04-01'

Проблема заключается в том, что результатом запроса является таблица с числом строк больше, чем основная таблица с тем жегде «состояние».Я не понимаю, чего мне не хватает

Спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Вероятно, в таблице сведений о записи основной таблицы имеется более одного аналога.

Я пробую ваш сценарий на моей базе данных получить правильный результат.

В моей базе данных:

select distinct p.PollId as PollId,
                p.Title AS Title,                               
                p.InsertDate AS DatDec,
                ps.date_ch as date_chsld
  from dbo.Poll AS p 
  left join  (select distinct pSt.PollId as pollId,
                              Max(pSt.InsertDate) as date_ch
               from dbo.PollStore as pSt 
           Group by pSt.PollId ) as ps   
on p.PollId =ps.pollId

Как ваш запрос, как это:

select distinct    VBen.BENF_NO_INDIV_BEN_BANLS as benbanls,
                               VBen.BENF_COD_SEXE AS Sexe,
                               VBen.BENF_DAT_NAISS AS DatNaiss,
                               VBen.BENF_DAT_DECES AS DatDec,
                               A.date_ch as date_chsld    
please try this query     
from PROD.V_FICH_ID_BEN_CM AS VBen     
left   join  (select distinct VAss.BENF_NO_INDIV_BEN_BANLS as benbanls,
                              Max(vass.BENF_DD_ADMIS_ASSU_MED) as date_ch
               from Prod.V_ADMIS_ASSU_MED_PLAN_PRIOR_CM Group by VAss.BENF_NO_INDIV_BEN_BANLS as vass ) as A   
   on VBen.BENF_NO_INDIV_BEN_BANLS =A. benbanls
   where Vben.BENF_DAT_NAISS>'2016-04-01' or Vben.BENF_DAT_DECES>'2011-04-01'
0 голосов
/ 23 мая 2018

Почему это проблема?Результаты просто показывают, что у вас есть отношение 1: M (один ко многим) между VBen: Vass (A)

Если у вас нет отношения 1: M, и оно должно быть 1: 1, тогда ...

  • вам не хватает критериев соединения между таблицами.
  • вы должны получать минимальную / максимальную дату вместо всех дат в benbanls

Чтобы лучше понять и ответить, нам нужно знать, что на самом деле представляют VBen и Vass;Проще говоря, у вас есть несколько VASS(A) на VBEN

Для иллюстрации на примере: Подумайте о таблицах Order_Header и Order_Line ...

Order_header содержит (order_Number PK) Order_line содержит(Order_Number, Order_Line PK)

Заказ может состоять из нескольких строк, каждая строка может иметь свою собственную дату отгрузки, и несколько товаров могли быть отправлены в один и тот же день / день.где некоторые, которые были отстранены, вышли в другой день.В этой ситуации в заказе по-прежнему будет несколько строк, даже если в подзапросе мы различаем order_number и shipmentdate.Я полагаю, что ваша ситуация аналогична.

, поэтому 1 в базовой таблице * 2 строки в производной таблице / таблицах строк дают нам 2 записи

1 <2, то есть ситуация, в которой вы сейчас находитесь;и это для меня совершенно нормально и ожидаемо, если это отношения 1: М. </p>

  • Может быть, вам нужно указать минимальную или максимальную дату вместо отдельной?
  • Если нетвам не хватает критериев объединения, чтобы установить отношения 1: 1
  • возможно, ваши ожидания просто ошибочны.

Ниже приведено соотношение 1: 1, но я неуверен, что это то, что вы ищете.

SELECT distinct VBen.BENF_NO_INDIV_BEN_BANLS as benbanls,
                VBen.BENF_COD_SEXE AS Sexe,
                VBen.BENF_DAT_NAISS AS DatNaiss,
                VBen.BENF_DAT_DECES AS DatDec,
                A.date_ch as date_chsld
FROM PROD.V_FICH_ID_BEN_CM AS VBen 
LEFT JOIN  (SELECT VAss.BENF_NO_INDIV_BEN_BANLS as benbanls,
                   Max(vass.BENF_DD_ADMIS_ASSU_MED) as date_ch
            FROM Prod.V_ADMIS_ASSU_MED_PLAN_PRIOR_CM as vass 
            GROUP BY VAss.BENF_NO_INDIV_BEN_BANLS) as A   
       on VBen.BENF_NO_INDIV_BEN_BANLS = A. benbanls
 WHERE (Vben.BENF_DAT_NAISS>'2016-04-01' 
    or Vben.BENF_DAT_DECES>'2011-04-01)
...