【问题标题】:SQL: outer join two tables on String and insert similar into anotherSQL:在字符串上外连接两个表并将类似的表插入另一个表
【发布时间】:2013-08-01 15:59:42
【问题描述】:

我有两张表 A 和 B,有 30 列(相同的变量名,不同年份的数据),没有主键,每列几乎有一百万条记录。

我想比较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

我得到的错误

消息 213,第 16 级,状态 1,第 1 行
插入错误:列名或提供的值的数量与表定义不匹配。

我创建了 C,目前是空的。

【问题讨论】:

  • 看来你只需要 A 和 B 的 UNION。
  • 您应该指定列名,而不是 SELECT *。
  • 并且您还应该始终在INSERT 子句中指定列以避免任何意外和问题!

标签: sql outer-join


【解决方案1】:
insert  C
select  *
from    A
union all
select  *
from    B
where  not exists
       (
       select  *
       from    A
       where   X1 = B.X1
       )

【讨论】:

    【解决方案2】:

    您的查询将不起作用,因为您要加入表并返回 *,结果会导致您需要的列数增加一倍。 您真正想要做的是从表 A 中选择所有内容,然后附加(而不是连接)表 B 中的所有记录。 追加是通过使用 UNION 来实现的。这是一些示例代码。注意:永远不要使用 SELECT *。添加以下内容,以正确顺序包含特定命名的字段。

    另外,我使用的是 UNION 而不是 UNION ALL,以便查询自动排除 B 中与 A 中的记录重复的记录。

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

    【讨论】:

      【解决方案3】:
      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
      

      【讨论】:

      • A 和 B 之间的外连接将产生一个 60 列宽的表。 C 只有 30 列。
      • 这就是我说“明确列出所有 tableA.Fields”的原因。感谢您的反对。
      • 这种操作需要联合,而不是连接。你没有抓住重点。这不是我的反对意见。
      猜你喜欢
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 2015-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多