0

SQL クエリに問題があります

employee_name、の 2 つの列を持つテーブルがありますphone_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

このクエリは間違っています。しかし、これは私がやろうとしていることです。

電話番号を電話番号テーブルに挿入し、同じ select ステートメントに ID を含めて、employee テーブルに挿入したいと考えています。

あなたの考え?

ファイナルテーブルは

テーブル全体(これは私が今持っているものです)

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

およびクエリの実行後

従業員テーブル

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

電話テーブル

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

3 に答える 3

1

ターゲットテーブルの構造が正しいかどうかはわかりませんが、これで問題は解決します。

最初に個別の電話番号ごとに 1 つの行をphone_table挿入し、次にと の間をemployee_table結合して挿入します。whole_tablephone_tablephone_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 フィドル

アップデート:

ここで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 フィドル

于 2013-03-06T07:01:21.357 に答える
0

@@ID を使用します。このような:

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)
于 2013-03-06T06:26:02.583 に答える
0

2 つの異なる SQL に分割する必要があります。1 つは EmployeeTable に挿入し、もう 1 つは phonetable に挿入します。

于 2013-03-06T06:30:33.843 に答える