0

我有以下表格

表 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”中创建一行,将名称拆分为名字和姓氏,如图所示,创建行后,将新行插入表 C,其中 RID 来自表 A,CID 来自表 B , IsAuthor 位默认为 0 和表 A 中的 CreatedOn。CID 自动递增。任何人都可以帮助我实现这一目标。我对 SQL 很陌生。谢谢!

4

3 回答 3

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.

于 2013-04-01T23:45:54.003 回答
1

我相信您正在寻找类似的东西(我遗漏了一些字段,但这应该能说明问题)。主要看的是用于将名称拆分为名字和姓氏的substringand函数: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 ;

SQL 小提琴演示

如果担心相同的名称、电子邮件等,那么您可能需要考虑使用可怕的光标和scope_identity(). 希望你不必走那条路。

于 2013-04-01T23:55:55.130 回答
1

要拆分名称,我会使用它CharIndex来查找空间的位置,然后Substring将单词分开。

为了跟踪 TableB 中的数据来自 TableA 中的哪一行,我只需将一列粘贴到 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

于 2013-04-02T00:04:00.487 回答