2015-06-22 5 views
1

Я пытаюсь извлечь данные из одной таблицы, а затем вставить ее в другую таблицу. Это образец первой таблицы, в которой указаны следующие данные. tb1 - это таблица, состоящая из данных. Два столбца Manager и TeamLeader в основном означают, например: Джош управляется Виком и так далее. Сотрудник также может быть менеджером другого работодателя. Например, Джош - менеджер Нирвана и Девы.Извлечь данные из одной таблицы и вставить в другую таблицу

+---------+-------------+ 
|  tbl1   | 
+---------+-------------+ 
| Manager | Employee | 
+---------+-------------+ 
| Vik  | Josh  | 
+---------+-------------+ 
| Vik  | Cindy  | 
+---------+-------------+ 
| Vik  | Alvin  | 
+---------+-------------+ 
| Vik  | Kim   | 
+---------+-------------+ 
| Josh | Nirvan  | 
+---------+-------------+ 
| Josh | Deva  | 
+---------+-------------+ 
| Cindy | Mervyn  | 
+---------+-------------+ 
| Nirvan | Reeta  | 
+---------+-------------+ 
| Nirvan | Zaki  | 
+---------+-------------+ 
| Nirvan | Sunny  | 
+---------+-------------+ 

Что я хочу, чтобы вставить все эти записи в другой таблице со следующими столбцами: Id (который установлен в IDENTITY/AUTONUM), имя (имя сотрудника/менеджера), ParentId (менеджера, который конкретный сотрудник должен отчитываться). Так, например, я должен получить что-то в этом роде:

ID Name ParentId 
1 Vik 0 
2 Josh 1 
3 Cindy 1 
4 Alvin 1 
5 Kim 1 
6 Nirvan 2 
7 Deva 2 
8 Mervyn 3 
9 Reeta 6 
10 Zaki 6 
11 Sunny 6 

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

+0

у вас есть таблица, которая содержит имя ParentID и менеджера? – phicon

+0

Нет. У меня есть только первая таблица, в которой есть данные. Из этой таблицы мне нужно заполнить вторую таблицу. Во второй таблице parent_id во многом совпадает с идентификатором во второй таблице. Например, поскольку у vik нет менеджера, с которым ему приходится сообщать, его родитель равен нулю. josh, cindy, alvin и kim сообщают Вику, поэтому их родителем является идентификатор vik, который равен 1 –

ответ

1
INSERT INTO tbl2 (
    Name 
    ,parentId 
    ) 
SELECT DISTINCT manager 
    ,0 
FROM tbl1 
WHERE manager NOT IN (
     SELECT employee 
     FROM tbl1 
     ) 

INSERT INTO tbl2 
SELECT DISTINCT employee 
    ,0 
FROM tbl1 

UPDATE tbl2 
SET parentid = parent.id 
FROM tbl2 
INNER JOIN tbl1 ON tbl2.Name = tbl1.employee 
INNER JOIN tbl2 parent ON parent.Name= tbl1.manager 
+0

. Вставки вставки немного запутываются, но в остальном им нужно объяснение, почему этот подход необходим. например: это должен быть двухэтапный процесс; вам нужно сначала вставить имена, чтобы получить уникальные идентификаторы –

+0

Спасибо mate :) Работает отлично –

2

Вы должны сделать это в два этапа. Один для создания всех ваших полей идентификатора. Затем вы можете присоединиться к этой таблице, чтобы совпасть работник найти менеджер и ID менеджера:

insert into MyNewTable (Name, ParentID) 
select Manager, ParentID 
from tbl1 
union 
select Employee, ParentID 
from tbl1 

update MyNewTable 
set MyNewTable.ParentId = Managers.Id 
from MyNewTable 
join tbl1 
on tbl1.Employee = MyNewTable.Name 
join MyNewTable Managers 
on MyNewTable.Name = Managers.Manager 
0
create table #tbl1 (manager char(15), employee char(15)) 

create table #tbl2 (ID int identity(1,1), Name char(15), ParentID int) 

insert into #tbl1 
values ('Vik', 'Josh') , 
('Vik'  , 'Cindy') , 
('Vik'  , 'Alvin') , 
('Vik'  , 'Kim') , 
('Josh' , 'Nirvan'), 
('Josh' , 'Deva') , 
('Cindy' ,'Mervyn') , 
('Nirvan' , 'Reeta'), 
('Nirvan' , 'Zaki'), 
('Nirvan' , 'Sunny') 

--- big Boss 
insert into #tbl2(Name, ParentID) 
SELECT DISTINCT manager, 0 
FROM #tbl1 
WHERE manager NOT IN (SELECT employee FROM #tbl1 ) 

--- Grab all Employees (Name) 
insert into #tbl2(Name) 
select distinct employee from #tbl1 

--- Update ParentID 
declare @StructureLevl int = 3 -- 0 1 2 3 Do something to figure out this number first 
declare @Var_int int = 0 
while (@Var_int < @StructureLevl) 
begin 
    update #tbl2 
    set ParentID= @Var_int +1 
    where Name in (select A.employee 
        from #tbl1 A inner join #tbl2 B on A.manager = B.Name 
        where B.ParentID = @Var_int) 

    set @Var_int +=1 
end 

select * from #tbl2 
order by ParentID 
Смежные вопросы