Как бы я сделал это в SQL? - PullRequest
       40

Как бы я сделал это в SQL?

0 голосов
/ 15 апреля 2010

Допустим, у меня есть следующие таблицы: PartyRelationship EffectiveDatedAttributes

PartyRelationship содержит столбец varchar с именем class.
EffectiveDatedAttributes содержит внешний ключ для PartyRelationship с именем 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'

возвращает список ProductAuthorization идентификаторов. Мне нужно взять этот список идентификаторов и вставить новую строку в EffectiveDatedAttributes для каждого идентификатора, содержащую этот идентификатор и некоторые другие данные. Как бы я перебрал возвращенные идентификаторы из предыдущего оператора select, чтобы сделать это?

Ответы [ 3 ]

2 голосов
/ 15 апреля 2010

Ты имеешь в виду что-то вроде этого?:

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. Вот самый запрос, который не требует использования общих табличных выражений:

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, и добавляю его, которое должно дать нам следующий доступный идентификатор, игнорируя различные проблемы изоляции транзакций. Есть более простой метод, который я опубликую в ближайшее время.

Также обратите внимание, что в операторе select вы можете включить дополнительные статические значения, которые используются для вставки в вашу таблицу. В вашем исходном запросе я заметил, что вы использовали слово «уникальный» вместо Distinct. Стандартное слово ANSI для обеспечения уникальности в выводе оператора select - 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
0 голосов
/ 15 апреля 2010

Я согласен с Томасом: оператор выбора, который вы уже получили, может сформировать основу отдельной таблицы (виртуальной таблицы).

Так сделайте это:

INSERT INTO EvvectiveDatedAtributes(VirtualTable.productauthorization , data, data, data)
FROM 
    (YourQueryHere) as VirtualTable
0 голосов
/ 15 апреля 2010

На самом деле insert может использовать результат из select. Как:

insert into YourTable
(col1, col2, col3)
select col1, col2, col3
from OtherTable

должно быть легко приспособить это к вашей ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...