c'est mon tableau 1:
NAME AGE SEX CITY ID
Clara 22 f New York 1
Bob 33 m Washington 2
Sam 25 m Boston 3
voici mon tableau 2:
NUMBER ID
555-1111 1
555-2222 2
555-3333 3
et maintenant je veux un tableau 3 qui me montre toutes les informations:
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
J'ai d'abord essayé d'insérer dans le tableau 3 uniquement les valeurs du tableau 1, puis d'insérer dans le tableau 3 les valeurs du tableau 2 avec une jointure interne où Id = Id est.
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
Mais tout ce que je reçois, c'est une duplication de mes valeurs. au lieu d'avoir 3 entrées, j'ai comme 9 entrées, dont certaines ont un nombre nul, d'autres seulement le nombre et le reste nul, et d'autres sont correctes.
J'espère que quelqu'un pourra m'aider
MODIFIER
Si j’ai maintenant une troisième table comme celle-ci:
NATIONALITY ID
Canadian 1
American 2
French 3
Comment pourrais-je fusionner les 3 tables en une seule?
Vous n'avez besoin que d'un seul 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
Au lieu de créer une nouvelle table, je vous suggère d'utiliser une vue combinant les deux tables. Ainsi, si l'une des données du tableau 1 ou du tableau 2 change, vous n'avez pas besoin de mettre à jour le troisième tableau:
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;
Si vous pouviez avoir des enregistrements dans une table et non dans l'autre, vous auriez besoin d'utiliser une jointure complète:
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;
Si vous savez que tous les enregistrements figureront dans la table 1 et seulement quelques-uns dans la table 2, vous devez utiliser un 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;
Si vous savez que tous les enregistrements figureront dans la table 2 et que quelques-uns seulement dans la table 2, vous pouvez utiliser un 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;
Ou bien inversez simplement l'ordre des tables et utilisez un LEFT JOIN (je trouve cela plus logique qu'un joint droit mais c'est une préférence personnelle):
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;
Essayez de faire:
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
En utilisant LEFT JOIN, cela insérera tous les enregistrements de la table 1 dans la table3 et pour ceux correspondant à la condition de jointure dans la table2, il insérera également leur numéro.
Si je vous ai bien compris, vous devriez pouvoir le faire en une requête, en joignant table1 et table2:
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
Voici une courte extension de 3 tables ou plus à la réponse de 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
Pour afficher les valeurs de 2 tables de manière prédéfinie, utilisez une vue
Voici un exemple si plusieurs tables n'ont pas d'identifiant commun, vous pouvez vous créer vous-même. J'utilise 1 as commonId
pour créer un identifiant commun afin que je puisse les joindre intérieurement:
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