2013-08-01 1 views
0

두 개의 테이블 A와 B는 30 개의 열 (동일한 변수 이름, 다른 연도의 데이터)을 가지며 기본 키는 없으며 각각 거의 백만 개의 레코드가 있습니다.SQL : 외부에서 두 테이블을 String으로 조인하고 다른 테이블과 비슷하게 삽입하십시오.

내가 B.X1A.X1 비교하려는 (nvarchar8를 공백 포함 - 문자 및 숫자)와 외부 (같은 30 열) 다른 테이블의 C 결과에 가입 삽입 그래서 나는 B A의 모든 행이! = B.X1에서 A).

예 :

표 A

X1 X2 X3 ..... X30 
11 E  R ..... G 
12 R  4  L 
13 S  5  NULL 
14 D  T  NULL 

테이블 B 테이블 C에게 결과

X1 X2 X3 ..... X30 
11 E  R ..... G 
12 R  4  L 
15 R2  56  NULL 
16 R1  T1  NULL 

내가 그렇게 할 방법

X1 X2 X3 ..... X30 
11 E  R ..... G 
12 R  4  L 
13 S  5  NULL 
14 D  T  NULL 
15 R2  56  NULL 
16 R1  T1  NULL 

.

나는 현재 비어있는, 내가 C가 만든 내가

Msg 213, Level 16, State 1, Line 1
Insert Error: Column name or number of supplied values does not match table definition.

을 얻을

INSERT INTO C 
SELECT * 
from A 
full outer join B 
on A.X1 = B.X1 

오류를 시도했다. 당신이 필요로 열 수의 두 배에 병이 결과 테이블과 retunring의 *를, 합류를 변경할 수 없기

+1

그것은 당신이 필요로하는 모든 것 A와 B의 UNION입니다 – Noel

+1

SELECT *가 아니라 열 이름을 지정해야합니다. –

+0

그리고 놀라움과 문제를 피하려면 항상 INSERT 절에 열을 지정해야합니다! –

답변

-1
Insert Into TableC 
(
    -- List your fields explicitly 
) 
Select 
    -- List all tableA.Fields explicitly 
From tableA 
Left Outer Join tableB On tableB.X1 = tableA.X1 
Where tablB.X1 IS NULL 
+1

A와 B 사이의 외부 조인은 60 열 너비의 테이블이됩니다. C에는 단지 30 개의 열만 있습니다. – Andomar

+0

그래서 "List all tableA.Fields 명시 적으로"라고 말한 것입니다. downvote 주셔서 감사합니다. – ganders

+0

이런 종류의 작업에는 조인이 아닌 공용체가 필요합니다. 당신은 그 요점을 놓치고 있습니다. 그리고 그것은 내 downvote 아니에요. – Andomar

1
insert C 
select * 
from A 
union all 
select * 
from B 
where not exists 
     (
     select * 
     from A 
     where X1 = B.X1 
     ) 
0

귀하의 쿼리가 작동하지 않습니다. 정말로 원하는 것은 표 A의 모든 항목을 선택하고 표 B의 모든 레코드를 결합하는 것이 아니라 결합하는 것입니다. 결합은 UNION을 사용하여 수행됩니다. 다음은 몇 가지 샘플 코드입니다. 참고 : 절대로 SELECT *를 사용하지 마십시오. 다음과 같이 특정 이름의 필드를 올바른 순서로 포함 시키십시오. 내가 쿼리가 automaticlly 찾을 A. 레코드의 중복입니다 B의 레코드를 제외 ALL 있도록 오히려 UNION보다는 UNION을 사용하고 또한

,

SELECT FIELDS... 
FROM TABLEA 
UNION 
SELECT SAME_FIELDS... 
FROM TABLEB