2013-08-01 36 views
0

我有兩個表A和B,包含30列(相同變量名稱,不同年份的數據),沒有主鍵,每個記錄近百萬條記錄。SQL:在String上外連接兩個表並將類似插入另一個

我想比較A.X1B.X1nvarchar8,包含空格, - ,字母和數字),並插入外連接在另一個表C中的結果(與相同的30列),所以我有A和其中B都行! = 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

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

所得表C中

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 

我如何做到這一點。

我試圖

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

錯誤,我得到

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

我有C語言創建的,這是目前空。 becasue你在你需要的列數的兩倍連接表和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

這就是爲什麼我說「明確列出所有tableA.Fields」。感謝downvote。 – ganders

+0

這種操作需要聯合而不是聯接。你錯過了這一點。這不是我的失望。 – Andomar

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

您的查詢將行不通。 你真正想要做的是從表A中選擇一切,然後APPEND(而不是加入)來自表B的所有記錄。 追加是通過使用UNION實現的。這裏是一些示例代碼。注意:永遠不要使用SELECT *。使用下面的命令添加專門命名的字段。

而且,我使用UNION而不是UNION ALL以便查詢程序自動排除在B中在A的記錄重複的記錄

SELECT FIELDS... 
FROM TABLEA 
UNION 
SELECT SAME_FIELDS... 
FROM TABLEB 
相關問題