Осталось присоединиться к подзапросу
Я пытаюсь сделать левое соединение на моей главной таблице с помощью этого кода
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'