Подтвердить что ты не робот

SQL INSERT INTO из нескольких таблиц

это моя таблица 1:

NAME       AGE        SEX        CITY             ID

Clara      22         f          New York         1
Bob        33         m          Washington       2
Sam        25         m          Boston           3

это моя таблица 2:

NUMBER       ID
555-1111     1
555-2222     2
555-3333     3

и теперь мне нужна таблица 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

Сначала я попытался вставить в таблицу 3 только значения из таблицы 1, а затем я ввел в таблицу 3 значения из таблицы 2 с внутренним соединением, где 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

Но все, что я получаю, - это дублирование моих значений. вместо того, чтобы иметь 3 записи, у меня есть 9 записей, некоторые из которых имеют номер null, некоторые из них имеют только число и остальное значение null, а некоторые - правильные.

Я надеюсь, что кто-то может мне помочь

ИЗМЕНИТЬ

Если у меня теперь есть третья таблица, подобная этой:

NATIONALITY       ID

Canadian          1
American          2
French            3

Как я могу объединить все 3 таблицы в одну таблицу?

4b9b3361

Ответ 1

Вам нужен только один INSERT:

INSERT INTO table3 ( 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

Ответ 2

Я бы предложил вместо создания новой таблицы просто использовать представление, которое объединяет две таблицы, таким образом, если какая-либо из данных в таблице 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;

Если у вас могут быть записи в одной таблице, а не в другой, то вам нужно будет использовать полное соединение:

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;

Если вы знаете, что все записи будут в таблице 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;

Если вы знаете, что все записи будут в таблице 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;

Или просто измените порядок таблиц и используйте 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;

Ответ 3

Попробуйте сделать:

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

Используя LEFT JOIN, он будет вставлять каждую запись из таблицы 1 в таблицу3, а для тех, которые соответствуют условию объединения в таблице2, он также вставляет их номер.

Ответ 4

Если я правильно понимаю вас, вы можете сделать это в одном запросе, объединив таблицы1 и таблицу2:

INSERT INTO table3 { name, age, sex, city, id, number}
SELECT p.name, p.age, p.sex, p.city, p.id, c.number
FROM table1 p
INNER JOIN table2 c ON c.Id = p.Id

Ответ 5

Вот краткое расширение для 3 или более таблиц к ответу D Стэнли:

INSERT INTO other_table (name, age, sex, city, id, number, nationality)
SELECT name, age, sex, city, p.id, number, n.nationality
FROM table_1 p
INNER JOIN table_2 a ON a.id = p.id
INNER JOIN table_3 b ON b.id = p.id
...
INNER JOIN table_n x ON x.id = p.id

Ответ 6

Чтобы показать значения из 2 таблиц заранее определенным образом, используйте VIEW

http://www.w3schools.com/sql/sql_view.asp

Ответ 7

Вот пример, если в нескольких таблицах нет общего идентификатора, вы можете создать себя, я использую 1 as commonId для создания общего идентификатора, чтобы я мог соединить их с ними:

Insert Into #TempResult
select CountA, CountB, CountC  from

(
select Count(A_Id) as CountA, 1 as commonId from tableA
  where ....
  and  ...
  and   ...
) as tempA

inner join
(
select Count(B_Id) as CountB, 1 as commonId from tableB
  where ...
  and ...
  and  ...
 ) as tempB

on tempA.commonId = tempB.commonId

inner join
(
select Count(C_ID) as CountC, 1 as commonId from tableC
where ...
and   ...
) as tempC

on tmepB.commonId = tempC.commonId

--view insert result
select * from #TempResult