0

我有四张桌子。

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 有一个字段“代码”,应该将其复制到带有街道地址和 zip 的代码表中,与地址表没有关系。

4

4 回答 4

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自己对表进行查询。

于 2013-10-29T09:00:24.737 回答
1

不,您不能在一个 MySQL 命令中插入多个表。但是,您可以使用事务。

BEGIN
INSERT INTO PERSON(LastName, FirstName)
SELECT
FirstName,
LastName
FROM TMP
INSERT INTO ADDRESS(Street)
SELECT
Street
FROM TMP;
COMMIT;
于 2013-10-29T09:02:13.200 回答
0

Select语句可以与插入语句结合使用,将数据从一个表复制到另一个表。需要注意的是,您必须包含移动的 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;
于 2013-10-29T09:02:49.217 回答
0

如果 (Address&Zip) 组合是唯一的,你可以使用这个:

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 选项

于 2013-10-29T09:28:30.173 回答