Ответ 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
это моя таблица 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 таблицы в одну таблицу?
Вам нужен только один 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
Я бы предложил вместо создания новой таблицы просто использовать представление, которое объединяет две таблицы, таким образом, если какая-либо из данных в таблице 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;
Попробуйте сделать:
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, он также вставляет их номер.
Если я правильно понимаю вас, вы можете сделать это в одном запросе, объединив таблицы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
Вот краткое расширение для 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
Чтобы показать значения из 2 таблиц заранее определенным образом, используйте VIEW
Вот пример, если в нескольких таблицах нет общего идентификатора, вы можете создать себя, я использую 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