2013-08-01 37 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 
相关问题