我有以下表格
表A
RID | Name |Phone |Email |CreatedOn
------------------------------------------------------------
1 | John Smith | 2143556789 |t1@gmail.com |2012-09-01 09:30:00
2 | Jason K Crull | 2347896543 |t2@gmail.com |2012-08-02 10:34:00
表B
CID| FirstName |LastName |Phone |Email |CreatedOn |Title|Address|City|State
---------------------------------------------------------------------------------------------------
11 | John | Smith |2143556789 |t1@gmail.com |2012-09-01 09:30:00|NULL|NULL|NULL|NULL
12 | Jason | K Crull |2347896543 |t2@gmail.com |2012-08-02 10:34:00|NULL|NULL|NULL|NULL
表C
RID | CID |IsAuthor|CreatedOn
-----------------------------------------
1 | 11 | 0 |2012-09-01 09:30:00
2 | 12 | 0 |2012-08-02 10:34:00
对于“表A”中的每一行,需要在“表B”中创建一行,将名称拆分为如图所示的名字和姓氏,并在创建行之后,使用表A中的RID将新行插入表C,CID从表B,IsAuthor位默认为0和表A中的CreatedOn.CID自动递增。任何人都可以帮助我实现这一目标。我是SQL新手。谢谢!
答案 0 :(得分:1)
不要再考虑“每一行”并将其视为“一套”。在SQL Server中逐行处理任何事情都很少有效,而且很难用这些术语来思考。
--INSERT dbo.TableC(RID, CID, IsAuthor, CreatedOn)
SELECT a.RID, b.CID, IsAuthor = 0, a.CreatedOn
FROM dbo.TableA AS a
INNER JOIN dbo.TableB AS b
ON a.Name = b.FirstName + ' ' b.LastName;
如果您认为它返回了正确的结果,请取消注释INSERT
。
答案 1 :(得分:1)
我相信你正在寻找这样的东西(我离开了一些领域,但这应该得到重点)。主要的是substring
和charindex
函数,用于将名称拆分为名字和姓氏:
insert into tableb (firstname,lastname,phone,email)
select
left(name, charindex(' ',name)-1),
substring(name, charindex(' ', name)+1, len(name)),
phone, email
from tablea ;
insert into tablec
select a.rid, b.cid, 0, a.createdon
from tablea a
inner join tableb b on a.name = b.firstname + ' ' + b.lastname
and a.phone = b.phone and a.email = b.email ;
如果对相同的名称,电子邮件等有疑虑,那么您可能需要考虑使用可怕的游标和scope_identity()
。希望你不必走那条路。
答案 2 :(得分:1)
要拆分名称,请使用CharIndex
查找空格的位置,然后Substring
将该字拆开。
为了跟踪TableA中TableB中的数据来自哪一行,我只是将一个列粘贴到B上以记录这些数据,然后在插入表C时将其删除。 另一种方法是使CID成为C而不是B的标识列,首先填充C,然后在填充时将该数据提供给TableB。
if OBJECT_ID('TableA','U') is not null drop table TableA
create table TableA
(
rid int not null identity(1,1) primary key clustered
, Name nvarchar(64)
, Phone nvarchar(16)
, Email nvarchar(256)
, CreatedOn datetime default (getutcdate())
)
if OBJECT_ID('TableB','U') is not null drop table TableB
create table TableB
(
cid int not null identity(1,1) primary key clustered
, FirstName nvarchar(64)
, LastName nvarchar(64)
, Phone nvarchar(16)
, Email nvarchar(256)
, CreatedOn datetime default (getutcdate())
, Title nvarchar(16)
, [Address] nvarchar(256)
, City nvarchar(64)
, [State] nvarchar(64)
)
if OBJECT_ID('TableC','U') is not null drop table TableC
create table TableC
(
rid int primary key clustered
, cid int unique
, IsAuthor bit default(0)
, CreatedOn datetime default (getutcdate())
)
insert TableA (Name, Phone, Email) select 'John Smith', '2143556789', 't1@gmail.com'
insert TableA (Name, Phone, Email) select 'Jason K Crull', '2347896543', 't2@gmail.com'
alter table TableB
add TempRid int
insert TableB(FirstName, LastName, Phone, Email, TempRid)
select case when CHARINDEX(' ', Name) > 0 then SUBSTRING(Name, 1, CHARINDEX(' ', Name)-1) else Name end
, case when CHARINDEX(' ', Name) > 0 then SUBSTRING(Name, CHARINDEX(' ', Name)+1, LEN(Name)) else '' end
, Phone
, Email
, Rid
from TableA
insert TableC (rid, cid)
select TempRid, cid
from TableB
alter table TableB
drop column TempRid
select * from TableB
select * from TableC
在此处试试:http://sqlfiddle.com/#!3/aaaed/1
或替代方法(在B之前插入C):http://sqlfiddle.com/#!3/99592/1