web-dev-qa-db-fra.com

SQL INSERT INTO à partir de plusieurs tables

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?

27
Paparis

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
52
D Stanley

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;
10
GarethD

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.

4
Filipe Silva

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
3
Andrew

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
3
kaba713

Pour afficher les valeurs de 2 tables de manière prédéfinie, utilisez une vue

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

1
Mike

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
0
yu yang Jian