Осталось присоединиться к подзапросу

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

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 ответа

Решение

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

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

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

Чтобы лучше понять и ответить, нам нужно знать, что на самом деле представляют 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: M.

  • Может быть, вам нужно сделать минимальную или максимальную дату вместо отдельного?
  • Если нет, вы пропускаете критерии объединения, чтобы установить соотношение 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)

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

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

В моей БД:

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'
Другие вопросы по тегам