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」に行を作成して、示されているように名前を名字と姓に分割する必要があります。行を作成した後、表 A の RID、表 B の CID を使用して新しい行を表 C に挿入します。 、IsAuthor ビットのデフォルトは 0 で、テーブル A から CreatedOn に設定されています。CID は自動インクリメントされます。誰でもこれを達成するのを手伝ってくれますか? 私はSQLに非常に慣れていません。ありがとう!

4

3 に答える 3

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 を ID にすることです。 B の代わりに C の列を作成し、最初に 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 に答える