SQL INSERT INTO来自多个表

Pap*_*ris 31 sql sql-server

这是我的表1:

NAME       AGE        SEX        CITY             ID

Clara      22         f          New York         1
Bob        33         m          Washington       2
Sam        25         m          Boston           3
Run Code Online (Sandbox Code Playgroud)

这是我的表2:

NUMBER       ID
555-1111     1
555-2222     2
555-3333     3
Run Code Online (Sandbox Code Playgroud)

现在我想要一张表3,它向我展示了所有信息:

NAME       AGE        SEX        CITY             ID        NUMBER

Clara      22         f          New York         1         555-1111
Bob        33         m          Washington       2         555-2222
Sam        25         m          Boston           3         555-3333
Run Code Online (Sandbox Code Playgroud)

我首先尝试只将表1中的值插入表3,然后我将表2中的值插入到表3中,其中内部连接的位置为Id = Id.

INSERT INTO table3 { name, age, sex, city, id}
SELECT name, age, sex, city, id
FROM table 1



INSERT INTO table3 { name, age, sex, city, id, number}
SELECT name, age, sex, city, id, number
FROM table 2 p
INNER JOIN table 3 c ON c.Id = p.Id
Run Code Online (Sandbox Code Playgroud)

但我得到的只是重复我的价值观.而不是有3个条目,我有9个条目,其中一些有数字null,有些只有数字,其余为null,有些是正确的.

我希望有一个人可以帮助我

编辑

如果我现在有一个像这样的第三个表:

NATIONALITY       ID

Canadian          1
American          2
French            3
Run Code Online (Sandbox Code Playgroud)

我怎么能将所有3个表合并到一个表中?

D S*_*ley 59

你只需要一个INSERT:

INSERT INTO table4 ( name, age, sex, city, id, number, nationality)
SELECT name, age, sex, city, p.id, number, n.nationality
FROM table1 p
INNER JOIN table2 c ON c.Id = p.Id
INNER JOIN table3 n ON p.Id = n.Id
Run Code Online (Sandbox Code Playgroud)

  • 我花了几秒钟才理解这个答案。插入(第一)行中的“table3”指的是与最后一个内连接不同的“table3”。我建议更新表名。也许在插入中我们可以有:“destination_table”和选择和连接“source_table1,2,3”。谢谢你。 (2认同)

Gar*_*thD 11

我建议您不要创建新表,只需使用组合了两个表的视图,这样如果表1或表2中的任何数据发生更改,您就不需要更新第三个表:

CREATE VIEW dbo.YourView
AS
    SELECT  t1.Name, t1.Age, t1.Sex, t1.City, t1.ID, t2.Number
    FROM    Table1 t1
            INNER JOIN Table2 t2
                ON t1.ID = t2.ID;
Run Code Online (Sandbox Code Playgroud)

如果您可以在一个表中创建记录,而不在另一个表中,那么您需要使用完整的连接:

CREATE VIEW dbo.YourView
AS
    SELECT  t1.Name, t1.Age, t1.Sex, t1.City, ID = ISNULL(t1.ID, t2.ID), t2.Number
    FROM    Table1 t1
            FULL JOIN Table2 t2
                ON t1.ID = t2.ID;
Run Code Online (Sandbox Code Playgroud)

如果你知道所有记录都在表1中,而只有表2中的一些记录,那么你应该使用LEFT JOIN:

CREATE VIEW dbo.YourView
AS
    SELECT  t1.Name, t1.Age, t1.Sex, t1.City, t1.ID, t2.Number
    FROM    Table1 t1
            LEFT JOIN Table2 t2
                ON t1.ID = t2.ID;
Run Code Online (Sandbox Code Playgroud)

如果您知道所有记录将在表2中,而只有表2中的某些记录,那么您可以使用 RIGHT JOIN

CREATE VIEW dbo.YourView
AS
    SELECT  t1.Name, t1.Age, t1.Sex, t1.City, t2.ID, t2.Number
    FROM    Table1 t1
            RIGHT JOIN Table2 t2
                ON t1.ID = t2.ID;
Run Code Online (Sandbox Code Playgroud)

或者只是颠倒表的顺序并使用LEFT JOIN(我发现这比正确的连接更合乎逻辑,但它是个人偏好):

CREATE VIEW dbo.YourView
AS
    SELECT  t1.Name, t1.Age, t1.Sex, t1.City, t2.ID, t2.Number
    FROM    Table2 t2
            LEFT JOIN Table1 t1
                ON t1.ID = t2.ID;
Run Code Online (Sandbox Code Playgroud)


Fil*_*lva 5

尝试做:

INSERT INTO table3(NAME,AGE,SEX,CITY,ID,NUMBER)
SELECT t1.name,t1.age, t1.sex,t1.city,t1.id,t2.number
FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.id
Run Code Online (Sandbox Code Playgroud)

通过使用 LEFT JOIN,这会将表 1 中的每条记录插入到表 3 中,对于匹配表 2 中连接条件的记录,它还会插入它们的编号。