2013-12-05 4 views
20

это мой стол 1:SQL INSERT INTO из нескольких таблиц

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 с внутренней join, где 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, а некоторые - правильные.

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

EDIT

Если я имею теперь третью таблицу, как это:

NATIONALITY  ID 

Canadian   1 
American   2 
French   3 

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

ответ

42

Вам необходима только одна вставка:

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 
+0

Отлично работает! Но что мне делать, если я беру значения из более чем двух таблиц? См. Мой Редактировать – Paparis

+0

Просто добавьте еще одно соединение - я отредактирую свой ответ –

+0

, спасибо, что он работал для меня. FYI Мне нужна ЛЕВАЯ ВСТУПЛЕНИЕ, потому что в некоторых столбцах у меня были нулевые значения. – Paparis

3

Если я правильно понять вас, вы должны быть в состоянии сделать это в одном запросе, присоединение table1 и таблица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 
4

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

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, он также будет вставлять их число.

9

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

Понизьте избирателей, чтобы прокомментировать? Я был бы заинтригован, чтобы услышать хороший аргумент в отношении того, почему мнение не подходит, или что не так с предложенными взглядами. – GarethD

+0

Большое спасибо, но взгляд не обязательно. Думаю, потому что мне больше не нужны старые таблицы, я просто пытаюсь получить все в одной таблице. – Paparis

3

Вот короткое расширение для 3 или более столы для ответа D Stanley:

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 
0

Вот пример, если несколько таблиц не имеют общего Id, вы можете создать сами, я использую 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 
Смежные вопросы