从select语句插入记录并将标识带回同一个选择查询

时间:2013-03-06 06:17:20

标签: sql sql-server sql-server-2008

我遇到了SQL查询的问题

我的表格有两列,employee_namephone_number。这个表有100行。

我想将employee_name存储在一个表中,将phone_number存储在另一个表中并建立关系。我将解释架构

EmployeeTable中

emp_id (identity)
emp_name (text)
ph_id (FK from the phone table)

手机

ph_id (identity)
phone_number 

所以我试过

insert into emp_table (emp_name, ph_id)
select employee_name, (insert into phone_table output inserted.ph_id values (whole.phone)) as phone_id

这个查询错了。但这就是我想要做的。

我想在电话号码表中插入电话号码,并在同一个选择语句中输入身份并插入员工表。

你的想法?

决赛桌应为

整张桌子(这就是我现在拥有的)

emp_name   phone_number
----------------------
name1      123
name2      456
name4      789

并在执行查询后

employee_table

name    ph_id
-------------
name1   1
name2   2
name3   3

phone_table

phone_id   phone_number
-------------------------
1          123
2          456
3          789

3 个答案:

答案 0 :(得分:1)

不确定您的目标表结构是否应该如此,但这样可以解决问题中的问题。

首先为每个不同电话号码向phone_table插入一行,然后插入employee_table并加入whole_tablephone_table之间的联接phone_number

insert into phone_table(phone_number)  
select distinct phone_number
from whole_table

insert into employee_table(name, ph_id)
select w.emp_name, p.phone_id 
from whole_table as w
  inner join phone_table as p
    on w.phone_number = p.phone_number

SQL Fiddle

<强>更新

您可以使用here所述的merge ... output来处理电话号码和姓名的重复。

使用表变量中生成的id捕获源数据,并使用insert语句中的表变量。

declare @T table
(
  phone_id int,
  emp_name varchar(10),
  phone_number varchar(10)
);

merge phone_table as p
using whole_table as w 
on 0 = 1
when not matched then
insert (phone_number) values (w.phone_number)
output inserted.phone_id,
       w.emp_name,
       w.phone_number
into @T(phone_id, emp_name, phone_number);

insert into employee_table(name, ph_id)
select t.emp_name, t.phone_id 
from @T as t;

SQL Fiddle

答案 1 :(得分:0)

使用@@ Identity。像这样:

insert into phoneTable(phone_number) values('999888777');

declare @phoneid int

set @phoneid = @@IDENTITY

insert into EmployeeTable(emp_name, ph_id) values('John Supakin', @phoneid)

或者,就这样。但是在长时间的查询中要小心。

insert into phoneTable(phone_number) values('999888777');

insert into EmployeeTable(emp_name, ph_id) values('John Supakin', @@IDENTITY)

答案 2 :(得分:0)

您必须分成两个不同的SQL。一个插入EmployeeTable,另一个插入phonetable。