2015-05-29 3 views
1

Мне нужно создать хранимую процедуру для вставки данных в одну таблицу из другой на основе некоторых условий. В существующей таблице, если два столбца (основная роль и вторичная роль) имеют одно и то же значение, тогда я хочу только одну строку в новой таблице с ролью в качестве основной роли.Как вставить строки в новую таблицу из другой таблицы на основе некоторых условий в Sybase?

В случае, если строка в старой таблице имеет разные значения в первичной роли и вторичной роли, я хочу, чтобы две строки в новой таблице имели значение роли в качестве основной роли старой таблицы, а другое как вторичное.

Каков наилучший способ достичь этого?

Сейчас мой запрос выглядит примерно так

create procedure proc as 
begin 
    insert into newTable values(role) 
    select primary_role as role from oldTable 
    where primary_role = secondary_role 
end 

Это не обрабатывает случай, когда главная роль не то же самое, как второстепенную роль.

Sample 

sample row oldTable 

PrimaryRole | SecondaryRole | Name 

admin  | analyst  | Sara 

sample row newTable 

Role | Name 

admin | Sara 

analyst | Sara 
+0

Можете ли вы дать некоторые выборочные данные, объясняя дело с различными значениями в главной роли и второстепенную роль? То есть строка в oldTable и две новые строки в newTable. – jarlh

ответ

1

Я не эксперт по sybase, но я бы сделал что-то вроде этого (синтаксис, возможно, потребуется изменить). Кроме того, если вы после исполнения, это, вероятно, может быть сделано гораздо умнее.

insert into newTable values(role, name) (
    select primary_role as role, name from oldTable 
    where primary_role+name not in (select distinct role+name from newTable) 
) 

    insert into newTable values(role, name) (
    select secondary_role as role, name from oldTable 
    where secondary_role+name not in (select distinct role+name from newTable) 
) 

Это, очевидно, запустить 2 различных вставок, поэтому он, вероятно, можно было бы сделать более производительным, но это будет в основном пытаются добавить все основные функции и все второстепенные роли, проверяя, если роль уже существует с предыдущий запуск. Поэтому нет необходимости проверять случай, когда primary = secondary.

EDIT

В качестве альтернативы, вы можете быть в состоянии использовать UNION ALL:

insert into newTable values(role, name) (
    select distinct role, name from (
     select primary_role as role, name from oldTable 
     union all 
     select secondary_role as role, name from oldTable 
    ) 
) 
+0

Круглые скобки вокруг 'select' бесполезны для оператора' insert ... select'. –

Смежные вопросы