2

約200フィールドの大きなテーブルがあります。1 つのフィールドからディメンション テーブルを作成するときに、これらのフィールドの約 100 が 1 つのフィールドにマップされます。問題は、これらの 100 個のフィールドの値を、100 個の挿入ステートメントのように 1 つずつ追加する必要があることです。これをより効率的に達成できるループや何かがありますか?

コードの例を次に示します。

    insert into DimTableA(visit_no, patient, facility, icd9, icd9_flag, ip_op)
    select D.registration, D3.med_number, D3.Hosp_Id, D.final_diagnosis_18,'d',IF(D3.Admit_Type in(1,2,3),'Inpatient','Outpatient'),
    from svch_dischs3_s D3, svch_diags_s D

    insert into DimTableA(visit_no, patient, facility, icd9, icd9_flag, ip_op)
    select D.registration, D3.med_number, D3.Hosp_Id, D.final_diagnosis_19,'d',IF(D3.Admit_Type in(1,2,3),'Inpatient','Outpatient'),
    from svch_dischs3_s D3, svch_diags_s D

    insert into DimTableA(visit_no, patient, facility, icd9, icd9_flag, ip_op)
    select D.registration, D3.med_number, D3.Hosp_Id, D.final_diagnosis_20,'d',IF(D3.Admit_Type in(1,2,3),'Inpatient','Outpatient'),
    from svch_dischs3_s D3, svch_diags_s D;

......... 等々

変更される唯一のフィールド名は「icd9」入力です (つまり、D.final_diagnosis_18、final_diagnosis_19、final_diagnosis_20 ....)

どんな助けでも本当にありがたいです、若者たち。:)

4

3 に答える 3

1

次のように、数値の固定セットへのクロス結合を使用して、これらの列のピボットを解除できます。

insert into DimTableA (
  visit_no,
  patient,
  facility,
  icd9,
  icd9_flag,
  ip_op
)
select
  D.registration,
  D3.med_number,
  D3.Hosp_Id,
  case N.number
    when 1 then D.final_diagnosis_18
    when 2 then D.final_diagnosis_19
    when 3 then D.final_diagnosis_20
    ...
  end,
  'd',
  IF(D3.Admit_Type in(1,2,3),'Inpatient','Outpatient')
from
  svch_dischs3_s D3,
  svch_diags_s D,
  (
    select 1 as number union all
    select 2           union all
    select 3           union all
    ...  /* up to the number of columns to unpivot */
  ) N

インライン ビューの代わりに永続的な数値テーブルを作成して入力し、そのテーブルの必要なサブセットをクエリで使用できます。その場合、クエリは次のように変更されます

...
from
  svch_dischs3_s D3,
  svch_diags_s D,
  numbers N
where N.number between 1 and … /* the number of columns to unpivot */
于 2012-07-03T13:21:45.720 に答える
0

ストアド プロシージャが問題を解決します。挿入するフィールド値とフィールドへの接尾辞のみを渡す必要がある場合がありD.final_diagnosis_ます。

コード スニペットの例を以下に示します。

drop procedure if exists proc_insert_icd9;
delimiter //
create procedure proc_insert_icd9( final_diagnosis_suffix int )
    begin
        declare suffixId int;
        declare sql_insert_str varchar( 255 );
        declare sql_select_str varchar( 255 );
        declare sql_temp varchar( 255 );
        set suffixId = final_diagnosis_suffix;

        set sql_insert_str = 'insert into DimTableA(visit_no, patient, facility, icd9, icd9_flag, ip_op) ';
        set sql_select_str = concat( 'select D.registration, D3.med_number, D3.Hosp_Id, D.final_diagnosis_', suffixId, ', ''d'', IF(D3.Admit_Type in(1,2,3), ''Inpatient'', ''Outpatient'' ) from svch_dischs3_s D3, svch_diags_s D' );

        select concat( sql_insert_str, sql_select_str ) into @sql_temp;

        prepare stmt from @sql_temp;
        execute stmt;
    end;
//
delimiter ;

ここで、フィールドの正しいサフィックス値をパラメーターとして必要な回数だけプロシージャーを呼び出してみfinal_diagnosisてください。

call proc_insert_icd9( 18 );
call proc_insert_icd9( 19 );

:手順を変更して含めることができます

  1. where句などを処理するためのより多くの入力パラメータ.
  2. select ステートメントへの where 句。
于 2012-07-03T13:30:05.833 に答える
0

サブセレクトでシングルINSERTを実行してみてください。UNION

現在の SQL にはデカルト結合が含まれているため、どこかで結合が欠落していると推測します。とにかく、これは私が運転しているもののアイデアを与えるはずです:

insert into DimTableA(visit_no, patient, facility, icd9, icd9_flag, ip_op)
select D.registration, D3.med_number, D3.Hosp_Id, D.final_diagnosis_18,'d',IF(D3.Admit_Type in(1,2,3),'Inpatient','Outpatient')
from svch_dischs3_s D3, svch_diags_s D
-- where D3.???? = D.????
union
select D.registration, D3.med_number, D3.Hosp_Id, D.final_diagnosis_19,'d',IF(D3.Admit_Type in(1,2,3),'Inpatient','Outpatient')
from svch_dischs3_s D3, svch_diags_s D
-- where D3.???? = D.????
union
select D.registration, D3.med_number, D3.Hosp_Id, D.final_diagnosis_20,'d',IF(D3.Admit_Type in(1,2,3),'Inpatient','Outpatient')
from svch_dischs3_s D3, svch_diags_s D
-- where D3.???? = D.????;

より理論的な例を次に示します。

create table dimTable
(id int unsigned not null default 0,
field varchar(50)
);

create table sourceTable
(id int unsigned not null default 0,
field1 varchar(50),
field2 varchar(50),
field3 varchar(50),
field4 varchar(50),
field5 varchar(50)
);

insert into sourceTable (id,field1,field2,field3,field4,field5) values (1,"hello","these","are","some","values");
insert into sourceTable (id,field1,field2,field3,field4,field5) values (2,"hello2","these2","are2","some2","values2");
insert into sourceTable (id,field1,field2,field3,field4,field5) values (3,"hello3","these3","are3","some3","values3");
insert into sourceTable (id,field1,field2,field3,field4,field5) values (4,"hello4","these4","are4","some4","values4");
insert into sourceTable (id,field1,field2,field3,field4,field5) values (5,"hello5","these5","are5","some5","values5");

insert into dimTable (id, field)
select id,field1 from sourceTable
union
select id,field2 from sourceTable
union
select id,field3 from sourceTable
union
select id,field4 from sourceTable
union
select id,field5 from sourceTable;

select *
from dimTable;

それが役に立てば幸い!

于 2012-07-03T11:51:27.133 に答える