0

次のような構造のテーブルがあります

create table DrugInteractions
(ndc_fk varchar(50) not null
,ndc_pk varchar(50) not null
,InteractionSeverity int not null,
primary key(ndc_fk,ndc_pk)
)

のような構造を持つ別のもの

   create table DrugList
    (char(11) not null
    ,drug_name varchar(50) not null
    ,drug_class char(3) not null,
    primary key(ndc)
    )

と Drug_name には 1 対多の関係がありますが、drug_classdrug_name と Drug_class の間にはもちろん 1 対 1 の関係があります。現在、次のシナリオで DrugInteraction テーブルにレコードを追加する 3 つのストアド プロシージャがあります。

あるクラスのすべての薬物が別のクラスと相互作用する

CREATE proc spInsertDrugInteractionsByDrugClass          
 @referenceClass char(3)          
,@interactingClass char(3)          
as          
begin          
;with x          
as          
(          
 select distinct  
   drug_name  

 from DrugList          
 where drug_class =@interactingClass          
)          
,y          
as          
(          
 select  drug_name  


 from Druglist          
 where drug_class = @referenceClass          
)          

insert into DrugInteractions(ndc_pk,ndc_fk)          
select distinct            
   upper(x.drug_name)    
  ,upper(y.drug_name)    
 from y,x          
end

sproc からの出力例

ndc_fk    ncd_pk
drug1     drug2
drug1     drug3
drug1     drug4

別の状況は、1 つの「参照」薬物クラスと、同じ drug_class である場合と異なる場合がある sproc へのパラメーターとして入力された他の薬物名がある場合です。

CREATE proc spInsertDrugInteractionsByClassAndName        
 @referenceClass char(3)        
,@d1 varchar(50) = null        
,@d2 varchar(50) = null        
,@d3 varchar(50) = null        
,@d4 varchar(50) = null        
,@d5 varchar(50) = null        
as begin        
;with refClassDrugNames       
as        
(        
 select distinct upper(drug_name) as drug_name  
 from DrugList        
 where drug_class = @referenceClass        
),        
drugName    
as        
(        
 select distinct upper(drug_name) as drug_name  
 from DrugList        
 where drug_name in (@d1,@d2,@d3,@d4,@d5)        
)        
insert into DrugInteractions(ndc_pk,ndc_fk)        
select * from refClassDrugNames,drugName        
end 

Sample output from this sproc would be:
ndc_pk   ndc_fk
drug1    refDrug
drug2    refDrug
drug3    refDrug
drug4    refDrug

このような状況では、複数のストアド プロシージャを使用するのは良い設計ですか、それとも悪い設計ですか? 1 つの sproc でこれら 2 つのシナリオをカバーする方法が必要だと思わずにはいられません。これに似たことを SQL Server だけで行うことはできますか?

4

0 に答える 0