SQL:垂直拆分表并创建/填充键、外键关系
我想垂直拆分现有的(已填充数据) 假设我的起始表(SQL:垂直拆分表并创建/填充键、外键关系,sql,sql-server,foreign-key-relationship,uniqueidentifier,vertical-partitioning,Sql,Sql Server,Foreign Key Relationship,Uniqueidentifier,Vertical Partitioning,我想垂直拆分现有的(已填充数据) 假设我的起始表(trip)如下所示: ID Person Age Trip_to Date ... Alice 21 Los Angeles 2015-04-01 ... Bob 35 New York 2015-03-15 ... Bob 3
trip
)如下所示:
ID Person Age Trip_to Date
... Alice 21 Los Angeles 2015-04-01
... Bob 35 New York 2015-03-15
... Bob 35 Chicago 2015-03-20
... Bob 35 San Francisco 2015-03-29
... Carol 29 Miami 2015-03-30
... Carol 29 Boston 2015-04-05
我想按原样将此表拆分为两个表,person
和trip
各一个表
在将每个唯一的人复制到表person
中时,我希望将该表person.pId
(主键)中自动创建的uniqueidentifier
列trip.personid
复制到原始表中新创建的uniqueidentifier
列中,并将其转换为外键。(然后,我将从原始表中删除trip.person
和trip.age
列,并按照我的要求对数据进行结构化。)
我想在将person行插入新表时可以使用触发器,如下所示:
CREATE TRIGGER tr_person
on person
after INSERT
as
begin
UPDATE Trip
SET personId=(SELECT i.pId from inserted i)
WHERE person=(SELECT i.person from inserted i) and age=(SELECT i.age from inserted i)
END
然而,我明白了:
Subquery returned more than 1 value.
This is not permitted when the subquery follows =, !=, <, <= , >, >=
or when the subquery is used as an expression.
所以我现在想知道,这一切都错了吗?有没有其他方法可以自动创建两个新拆分的表之间的键和关系
编辑所需结果:
表行程:
ID Trip_to Date PersonId
... Los Angeles 2015-04-01 xxxx1
... New York 2015-03-15 xxxx2
... Chicago 2015-03-20 xxxx2
... San Francisco 2015-03-29 xxxx2
... Miami 2015-03-30 xxxx3
... Boston 2015-04-05 xxxx3
餐桌上的人
pId Person Age
xxxx1 Alice 21
xxxx2 Bob 35
xxxx3 Carol 29
(当然,ID字段都应该是唯一标识符)这里有一个想法:
首先,将所有不同的Person
从Trip
表插入到Person
表:
CREATE TABLE Person(
pID UNIQUEIDENTIFIER PRIMARY KEY,
Person VARCHAR(10),
Age INT
)
INSERT INTO Person
SELECT
NEWID(), Person, Age
FROM(
SELECT DISTINCT Person, Age FROM Trip
)t
ALTER TABLE Trip
ADD PersonId UNIQUEIDENTIFIER
FOREIGN KEY(PersonId) REFERENCES Person(pId)
ALTER TABLE Trip DROP COLUMN Person
ALTER TABLE Trip DROP COLUMN Age
然后,在Trip
表PersonId
中添加一个新的FK列,该列引用Person
表中的pId
:
CREATE TABLE Person(
pID UNIQUEIDENTIFIER PRIMARY KEY,
Person VARCHAR(10),
Age INT
)
INSERT INTO Person
SELECT
NEWID(), Person, Age
FROM(
SELECT DISTINCT Person, Age FROM Trip
)t
ALTER TABLE Trip
ADD PersonId UNIQUEIDENTIFIER
FOREIGN KEY(PersonId) REFERENCES Person(pId)
ALTER TABLE Trip DROP COLUMN Person
ALTER TABLE Trip DROP COLUMN Age
然后,使用Person
上的JOIN
和Age
使用Person
表中的值更新新添加的FK列:
UPDATE t
SET PersonId = p.pID
FROM Trip t
INNER JOIN Person p
ON p.Person = t.Person
AND p.Age = t.Age
最后,您可以从Trip
表中删除Person
和Age
:
CREATE TABLE Person(
pID UNIQUEIDENTIFIER PRIMARY KEY,
Person VARCHAR(10),
Age INT
)
INSERT INTO Person
SELECT
NEWID(), Person, Age
FROM(
SELECT DISTINCT Person, Age FROM Trip
)t
ALTER TABLE Trip
ADD PersonId UNIQUEIDENTIFIER
FOREIGN KEY(PersonId) REFERENCES Person(pId)
ALTER TABLE Trip DROP COLUMN Person
ALTER TABLE Trip DROP COLUMN Age
结果
人
pID Person Age
------------------------------------ ---------- -----------
35815766-1634-45FF-A3F6-8194B43F3F65 Alice 21
8EB3A7CC-CED1-4DBC-98B0-99D325BC7F67 Bob 35
D0EDCEA8-3825-4693-9352-BF7A04AEFCB2 Carol 29
行程
ID Trip_to Date PersonId
------------------------------------ -------------------- ---------- ------------------------------------
77357A57-FAAE-43DE-923E-219038B8641E Los Angeles 2015-04-01 35815766-1634-45FF-A3F6-8194B43F3F65
C1B64E81-D30A-46A9-A868-1D92C4B64B8C New York 2015-03-15 8EB3A7CC-CED1-4DBC-98B0-99D325BC7F67
21F3614A-8E76-4A64-8A0B-815D5343FC26 Chicago 2015-03-20 8EB3A7CC-CED1-4DBC-98B0-99D325BC7F67
E1DB1926-4268-4BFA-B5E0-DA603DA8E1B7 San Francisco 2015-03-29 8EB3A7CC-CED1-4DBC-98B0-99D325BC7F67
F50E45E6-E689-444B-96C1-F936CA6F3D2A Miami 2015-03-30 D0EDCEA8-3825-4693-9352-BF7A04AEFCB2
C2FA7073-79D7-42E8-B2C8-6EEDBC374002 Boston 2015-04-05 D0EDCEA8-3825-4693-9352-BF7A04AEFCB2
旁注:您不应存储此人的年龄
。相反,存储生日并动态计算年龄。请发布预期结果。我添加了表格,因为我希望它们看起来像;我希望这有帮助?干杯,干杯,这确实有效。我试图同时做这一切,但这是一个更清晰,更优雅。至于年龄
,我只是在为我的示例寻找一个简单的属性。实际上,我想要使用的表有大约50列和250.000行。我导入了一个csv文件,现在需要将其排序到多个表中。再次感谢!