我有两个表A和B,有30列(相同的变量名,不同年份的数据),没有主键,每个记录差不多有一百万。
我想将A.X1
与B.X1
(nvarchar8
,包含空格, - ,字母和数字)进行比较,并将外部联接结果插入另一个表C(具有相同的30列)所以我有所有A行,其中B!= B.在B.X1上)。
示例:
表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
插入错误:列名或提供的值数与表定义不匹配。
我创建了C,目前是空的。
答案 0 :(得分:1)
insert C
select *
from A
union all
select *
from B
where not exists
(
select *
from A
where X1 = B.X1
)
答案 1 :(得分:0)
您的查询将无法正常工作,因为您正在加入表格并重新调整*,结果不合适的是您需要的列数的两倍。 你真正想要做的是从表A中选择所有内容,然后选择APPEND(而不是加入)表B中的所有记录。 使用UNION实现追加。这是一些示例代码。注意:永远不要使用SELECT *。 Addapt接下来以正确的顺序包含特定命名的字段。
此外,我使用UNION而不是UNION ALL,以便查询自动排除B中与A中记录重复的记录。
SELECT FIELDS...
FROM TABLEA
UNION
SELECT SAME_FIELDS...
FROM TABLEB
答案 2 :(得分:-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