我将如何在SQL中执行此操作?

时间:2010-04-14 23:45:09

标签: sql oracle

假设我有以下表格: 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才能执行此操作?

3 个答案:

答案 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