2013-04-01 3 views
0

У меня есть следующие таблицыРазбивает строку, копировать данные в несколько таблиц

Таблица A

RID | Name  |Phone  |Email  |CreatedOn 
------------------------------------------------------------ 
1 | John Smith | 2143556789 |[email protected] |2012-09-01 09:30:00 
2 | Jason K Crull | 2347896543 |[email protected] |2012-08-02 10:34:00 

Таблица B

CID| FirstName |LastName |Phone  |Email  |CreatedOn   |Title|Address|City|State 
--------------------------------------------------------------------------------------------------- 
11 | John  | Smith |2143556789 |[email protected] |2012-09-01 09:30:00|NULL|NULL|NULL|NULL 
12 | Jason  | K Crull |2347896543 |[email protected] |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 и CreatedOn из таблицы A. CID автоматически увеличивается. Может ли кто-нибудь помочь мне в этом. Я очень новичок в SQL. Благодаря!

ответ

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 ; 

SQL Fiddle Demo

Если есть беспокойство за те же имена, электронные письма и т.д., то вам, вероятно, придется искать в использовании ужасного курсора и scope_identity(). Надеюсь, вам не придется идти по этому маршруту.

+0

Большое вам спасибо! – Krishh

+0

@ Krishh - np, рад, что мы сможем помочь! – sgeddes

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.

+0

Спасибо, я начинаю думать как «набор» с этого момента. Я не знал, как логически мыслить при написании кода sql. Вы дали мне подход к тому, как думать при написании сценариев sql. – Krishh

1

Чтобы разделить имя, я бы использовал CharIndex, чтобы найти место в пространстве, затем Substring, чтобы разбить слово на части.

Для отслеживания какой строки в таблице A данные из 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', '[email protected]' 
insert TableA (Name, Phone, Email) select 'Jason K Crull', '2347896543', '[email protected]' 

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

Или альтернативный метод (добавление к С перед Б) здесь: http://sqlfiddle.com/#!3/99592/1

+0

Спасибо. Благодарим вас за подробное объяснение. – Krishh

Смежные вопросы