Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:垂直拆分表并创建/填充键、外键关系_Sql_Sql Server_Foreign Key Relationship_Uniqueidentifier_Vertical Partitioning - Fatal编程技术网

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文件,现在需要将其排序到多个表中。再次感谢!