Я постараюсь быть максимально подробным. Наш корпоративный контролер запросил у меня информацию о наших поставщиках. Вот таблицы:
spp
= таблица поставщиков, у каждого поставщика одна запись, 5222 записи
ast
= профиль учетной записи поставщика, существует связь (M, 1) между этой таблицей и spp, в этой таблице имеется 8 950 записей. Каждый дубликат spp_id имеет свой собственный atp_id, который является профилем транзакции.
crt
= информация о банковском счете, поставщик может иметь или не иметь информацию о банковском счете
xvd
= таблица проверочных таблиц, xvd.xcd_id - это поле, содержащее идентификатор проверочной таблицы. Проверочная таблица 0007 - это таблица, содержащая информацию о скидках.
Вот мой сценарий:
select spp.spp_id supp_num,
spp.spp_matchname supp_name,
case when spp.spp_ddcalculation = 0
then 'End of Month'
else
case when spp.spp_ddcalculation = 1
then 'Net'
else
case when spp.spp_ddcalculation = 2
then 'End of 10, 20, 30'
else
case when spp.spp_ddcalculation = 3
then 'End of 15 or 30'
else null
end
end
end
end calculation1,
convert(varchar(2), spp.spp_ddduration) + case when spp.spp_ddmd = 0
then ' Days'
else case when spp.spp_ddmd = 1
then ' Months'
else null
end
end duration1,
spp.spp_ddday stop_day1,
xvd.xvd_desc discount,
crt.crt_name bank,
case when ast.ast_ddcalculation = 0
then 'End of Month'
else
case when ast.ast_ddcalculation = 1
then 'Net'
else
case when ast.ast_ddcalculation = 2
then 'End of 10, 20, 30'
else case when ast.ast_ddcalculation = 3
then 'End of 15 or 30'
else null
end
end
end
end
calculation2,
convert(varchar(2), ast.ast_ddduration) + case when ast.ast_ddmd = 0
then ' Days'
else case when ast.ast_ddmd = 1
then ' Months'
else null
end
end
duration2,
ast.ast_ddday stop_day2
from spp left join ast on spp.spp_id = ast.spp_id
left join crt on ast.crt_id = crt.crt_id
inner join xvd on ast.cfd_id = xvd.xcv_id
where xvd.xcd_id = '0007'
and xvd.lng_id = 0
order by spp.spp_id
Проблема в том, что в таблице ast есть 371 запись с ненулевым cfd_id, который является полем, относящимся к скидке в проверочной таблице 0007. Когда я запускаю это, я получаю 371 запись, но мне нужны все поставщики, даже те, с нулевыми скидками. Я знаю, что проблема заключается в сочетании моих объединений и того факта, что в проверочной таблице 0007 нет нулевого значения xcv_id. Может ли кто-нибудь увидеть что-то вопиющее, которое я пропустил?
Напомним, в ast есть 8 950 записей, но только 371 из них имеют ненулевой cfd_id. Мне нужно взять все 8 950 записей, я не могу извлечь нулевые скидки. Я думаю, что я, вероятно, могу вытащить все в временную таблицу, а затем получить скидки, но мне интересно, есть ли способ сделать это в одном операторе выбора.
Спасибо
Tony
Edit: последняя строка моего утверждения from, кажется, является основной проблемой
inner join xvd on ast.cfd_id = xvd.xcv_id
Нет нулевого xcv_id, но есть нулевой cfd_id. Есть ли другой способ объединить эти две таблицы, кроме проверки на равенство?
Забыл упомянуть, мы находимся на SQL Server 2008 R2.