MS SQL插入两个表

时间:2013-10-29 08:58:29

标签: sql-server tsql

我有四张桌子。

Person(
GUID uniqueidentifier
LastName varchar(20)
FirstName varchar(20)
SSN varchar(20)
ResidenceAddressGUID uniqueidentifier
)

Adress(
GUID uniqueidentifier
Street varchar(50)
Zip varchar(10)

)
Code(
CodeNumber
PersonGUID
Street
Zip

)
Tmp(
FirstName
LastName
Street
Zip
CodeNumber
)

我想将数据从Tmp移动到Person和Adress。最简单的方法是什么?

编辑:

我实际上发现TMP有一个字段“Code”,应该使用street-adress和zip复制到Code表中,与地址表没有任何关系。

4 个答案:

答案 0 :(得分:1)

您可以使用INSERT INTO语句结合SELECT语句将要插入的TMP中的列映射到ADDRESS。

INSERT INTO Address(Street, Zip)
SELECT
    Street,
    Zip
FROM TMP

另外,你对PERSON表做同样的事情。

INSERT INTO Person(LastName, FirstName, ResidenceAddressGUID)
SELECT
    T.Street,
    T.Zip,
    A.GUID
FROM TMP T INNER JOIN ADDRESS A 
               ON T.Street = A.Street
                   AND T.Zip = A.Zip

根据您之后的评论,我修改了我的查询,希望您现在了解该模式,并且可以自己对CODE表进行查询。

答案 1 :(得分:1)

不,您无法在一个MySQL命令中插入多个表。但是,您可以使用交易。

BEGIN
INSERT INTO PERSON(LastName, FirstName)
SELECT
FirstName,
LastName
FROM TMP
INSERT INTO ADDRESS(Street)
SELECT
Street
FROM TMP;
COMMIT;

答案 2 :(得分:0)

Select语句可以与insert语句结合使用,将数据从一个表复制到另一个表。需要注意的是,您必须包含移动的tmp数据的主键。在我的例子中,我已经包含了一个序列,它可以与Oracle数据库一起使用。根据键的分配方式,您可以省略序列,例如存在MySql自动编号时。

insert into Person(GUID, FirstName, LastName) 
select PERSON_SEQ.nextval, FirstName, LastName from Tmp;

insert into Adress(GUID, Street, Zip) 
select ADRESS_SEQ.nextval, Street,Zip from Tmp;

答案 3 :(得分:0)

如果(地址和邮编)组合是唯一的,您可以使用:

INSERT INTO Address
SELECT DISTINCT
    T.Street,
    T.Zip
FROM 
    TMP T LEFT JOIN
    Address A ON A.Zip = T.Zip AND Z.Street = T.Street
WHERE
    A.GUID IS NULL

INSERT INTO Person (
    FirstName,
    LastName,
    ResidenceAddressGUID) 
SELECT
    T.FirstName,
    T.LastName,
    A.GUID 
FROM 
    TMP T INNER JOIN
    Address A ON A.Street = T.Street AND A.ZIP = T.ZIP

如果它们不是唯一的,你应该看看mssql INSERT OUTPUT选项