it-source

여러 테이블에서 SQL INSERT INTO

criticalcode 2023. 7. 30. 17:54
반응형

여러 테이블에서 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의 값만 삽입하고, 표 2의 값을 표 3에 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

세 개의 테이블을 모두 하나의 테이블로 병합하려면 어떻게 해야 합니까?

하나의 INSERT만 있으면 됩니다.

INSERT INTO destinationTable( name, age, sex, city, id, number, nationality)
SELECT name, age, sex, city, s1.id, number, s3.nationality
FROM sourceTable1 s1
INNER JOIN sourceTable2 s2 ON s2.Id = s1.Id
INNER JOIN sourceTable3 s3 ON s3.Id = s1.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;

또는 표의 순서를 반대로 하고 왼쪽 조인을 사용합니다(오른쪽 조인보다 논리적이지만 개인적인 선호 사항입니다).

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의 조인 조건과 일치하는 레코드의 경우 번호도 삽입됩니다.

다음은 D Stanley의 답변에 대한 3개 이상의 테이블에 대한 짧은 확장입니다.

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

제가 올바르게 이해하고 있다면, 표 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

두 테이블의 값을 미리 정의된 방식으로 표시하려면 VIEW를 사용합니다.

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

다음은 여러 테이블에 공통 ID가 없는 경우 사용자가 직접 생성할 수 있는 예제입니다.1 as commonId내부에서 참여할 수 있도록 공통 ID를 생성합니다.

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

언급URL : https://stackoverflow.com/questions/20404682/sql-insert-into-from-multiple-tables

반응형