我目前正在将我们现有的数据库之一转移到新的本体上。数据库遵循星型模式,其中observation_fact是星的中心,concept_dimension是查找表。为了转移到新的本体,我需要用稍有不同的代码替换observation_fact中的concept_cd,以匹配新的本体中的concept_cd。
我尝试编写一个更新查询来完成此迁移,但是它已经运行了5天,我认为它不会很快完成。我已经在concept_cd上索引了两个相关的表。
这是我最初编写的查询:
Update observation_fact ofact
Set concept_cd = q.cd
From (Select ofact2.ctid, Case
When split_part(ofact2.concept_cd, ':', 1) = 'ICD10-CM' Then replace(ofact2.concept_cd, 'ICD10-CM:', 'ICD10CM:')
When split_part(ofact2.concept_cd, ':', 1) = 'ICD10-PCS' Then replace(ofact2.concept_cd, 'ICD10-PCS:', 'ICD10PCS:')
When split_part(ofact2.concept_cd, ':', 1) = 'ICD9' And cdim.concept_path like '\\i2b2\\Diagnoses\\%' Then replace(ofact2.concept_cd, 'ICD9:', 'ICD9CM:')
When split_part(ofact2.concept_cd, ':', 1) = 'ICD9' And cdim.concept_path like '\\i2b2\\Procedures\\%' Then replace(ofact2.concept_cd, 'ICD9:', 'ICD9PROC:')
End as cd
From observation_fact ofact2
Left Outer Join concept_dimension_bak cdim
On ofact2.concept_cd = cdim.concept_cd
) as q
Where ofact.ctid = q.ctid;
编写它感觉很尴尬,因为observation_fact没有真正的主键或复合键,因此我不得不使用ctid。我还两次使用了observation_fact,从这个答案Speed up Postgres Update on Large Table中我知道这是一个坏主意,可能是问题的一部分。我之所以使用左外部联接,是因为concept_fact中的一些concept_cds在concept_dimension_bak中不存在。如您所见,ICD10的替换非常容易,但是对于ICD9,我需要在旧的concept_dimension表中查找代码,以便找出它是哪种类型的代码,并相应地进行替换。
我希望此更新查询能够对case语句匹配的observation_fact中的任何行执行适当的替换,而忽略其他所有内容。
答案 0 :(得分:0)
首先,更新表中的所有行将花费一些时间。有时,用所有修改过的数据创建一个新表,截断原始表并重新加载它会更快。
第二,您两次引用observation_fact
,但这似乎没有必要。我认为这可以满足您的要求:
update observation_fact ofact
set concept_cd = (case when split_part(ofact.concept_cd, ':', 1) = 'ICD10-CM'
then replace(ofact.concept_cd, 'ICD10-CM:', 'ICD10CM:')
when split_part(ofact.concept_cd, ':', 1) = 'ICD10-PCS'
then replace(ofact.concept_cd, 'ICD10-PCS:', 'ICD10PCS:')
when split_part(ofact.concept_cd, ':', 1) = 'ICD9' And cdim.concept_path like '\\i2b2\\Diagnoses\\%'
then replace(ofact.concept_cd, 'ICD9:', 'ICD9CM:')
when split_part(ofact.concept_cd, ':', 1) = 'ICD9' And cdim.concept_path like '\\i2b2\\Procedures\\%'
then replace(ofact.concept_cd, 'ICD9:', 'ICD9PROC:')
end) as cd
from concept_dimension_bak cdim
where ofact.concept_cd = cdim.concept_cd;
您可能需要将不匹配的值设置为NULL
。
答案 1 :(得分:0)
您应该尝试使用SQL中具有的逻辑来创建新表,而不是更新表,这样会更快。创建新表后,您可以重命名旧表并将新表重命名为observation_fact
重申 1.创建新表
insert into observation_fact_new
select ...
from observation_fact
alter table observation_fact rename to observation_fact_old
alter table observation_fact_new rename to observation_fact
检查和测试完成后,删除旧表
drop table observation_fact_old