Извлечение пустых полей в SQL Server - PullRequest
0 голосов
/ 13 октября 2011

Я постараюсь быть максимально подробным. Наш корпоративный контролер запросил у меня информацию о наших поставщиках. Вот таблицы:

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.

Ответы [ 3 ]

0 голосов
/ 13 октября 2011

Решает ли это проблему?

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 xvd.xcv_id = ast.cfd_id
WHERE  xvd.xcd_id = '0007'
   AND xvd.lng_id = 0
0 голосов
/ 14 октября 2011

Это звучит как идеальное использование для просмотра.Вместо того, чтобы пытаться создать один сложный запрос, вы можете создать серию представлений, которые основываются друг на друге и фильтруют данные так, как вы этого хотите ... затем применить последний запрос к последнему представлению.

0 голосов
/ 13 октября 2011

Я думаю, что вы можете просто изменить свое внутреннее соединение на левое соединение:

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 

до

from spp left join ast on spp.spp_id = ast.spp_id 
left join crt on ast.crt_id = crt.crt_id 
left join xvd on ast.cfd_id = xvd.xcv_id 

Если вы говорите, что хотите выбрать записи, где xvd.xcd_id равно 0007 или null, тогда измените условие where на:

(xvd.xcd_id = '0007' OR xvd.xcd_id is null)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...