假设我有以下表格:
PartyRelationship
EffectiveDatedAttributes
PartyRelationship
包含一个名为class
的varchar列
EffectiveDatedAttributes
包含名为PartyRelationship
的{{1}}的外键。
如果我这样做:
ProductAuthorization
它返回select unique
eda.productauthorization
from
effectivedatedattributes eda
inner join
partyrelationship pr
on
eda.productauthorization = pr.ID
where
pr.class = 'com.pmc.model.bind.ProductAuthorization'
个ID的列表。我需要获取这个ID列表,并为每个ID在ProductAuthorization
中插入一个新行,其中包含ID以及其他一些数据。我如何迭代上一个select语句中返回的ID才能执行此操作?
答案 0 :(得分:2)
你的意思是这样的吗?:
Insert EffectiveDatedAttributes ( Id, Col1, Col2....)
select unique eda.productauthorization, 'Attribute1', 'Attribute2'....
from effectivedatedattributes eda
inner join partyrelationship pr
on eda.productauthorization = pr.ID
where pr.class = 'com.pmc.model.bind.ProductAuthorization';
或者是否有其他表涉及应插入的内容?
编辑鉴于您在评论中提供的其他详细信息,您需要生成进入EffectiveDateAttributes
的ID值。这是一个不需要使用公用表表达式的查询:
Insert EffectiveDateAttributes( Id, Col1, Col2, Col3, ..., )
Select Distinct
(
Select Count(*) + LastId.Id + 1
From PartyRelationship As PR1
Where PR1.class = 'com.pmc.model.bind.ProductAuthorization';
And PR1.ID < PR.ID
) Id
, PR.ID, 'Static Value 1', 'Static Value 2', PR.Col1, PR.Col2...
From PartyRelationship PR
Join EffectiveDateAttributes EDA
On EDA.ProductAuthorization = PR.ID
Cross Join (
Select Max(ID) Id
From EffectiveDateAttributes
) As LastId
Where PR.class = 'com.pmc.model.bind.ProductAuthorization'
我仍然不太相信我需要加入EffectiveDateAttributes。它的唯一目的是确保我们在PartyRelationship表中评估的任何值都存在于EffectiveDateAttributes表中。如果这无关紧要,那就可以删除。
其次,我通过查询PartyRelationship的所有值小于当前值的计数来生成序列。这将给我一系列从零开始的数字。然后,我添加当前存在于EffectiveDateAttributes
中的最高ID值,并添加一个,这应该为我们提供下一个可用的ID,忽略各种事务隔离问题。我将简要介绍一种更简单的方法。
另请注意,在select语句中,您可以包含用于插入表中的其他静态值。在原始查询中,我注意到您使用了“unique”一词而不是Distinct
。用于确保select语句输出唯一性的ANSI标准字是Distinct
,Oracle将识别这一点。
编辑使用公用表表达式,使其更简单:
With NumberedTables As
(
Select PR.ID
, ROW_NUMBER() OVER( ORDER BY PR.ID ) As Num
From PartyRelationship PR
Join EffectiveDateAttributes EDA
On EDA.ProductAuthorization = PR.ID
Where PR.class = 'com.pmc.model.bind.ProductAuthorization'
Group By PR.ID
)
, LastIdUsed As
(
Select Max(ID) Id
From EffectiveDateAttributes
)
Insert EffectiveDateAttributes( Id, Col1, Col2, Col3, ..., )
Select Num + LastIdUsed.Id, 'Static Value 1', 'Static Value 2', PR.Col1, PR.Col2...
From NumberedTables
Join PartyRelationship PR
On PR.ID = NumberedTables.ID
Cross Join LastIdUsed
答案 1 :(得分:0)
实际上insert
可以使用select
的结果。像:
insert into YourTable
(col1, col2, col3)
select col1, col2, col3
from OtherTable
应该很容易适应你的情况。
答案 2 :(得分:0)
我同意Thomas的看法,你已经获得的select语句可以构成一个单独的表(虚拟表)的基础。
这样做:
INSERT INTO EvvectiveDatedAtributes(VirtualTable.productauthorization , data, data, data)
FROM
(YourQueryHere) as VirtualTable