【问题标题】:UNION ALL query: "Too Many Fields Defined"UNION ALL 查询:“定义的字段太多”
【发布时间】:2012-12-12 19:02:23
【问题描述】:

我正在尝试获得 3 个表的 UNION,每个表都有 97 个字段。我尝试了以下方法:

select * from table1
union all
select * from table2
union all
select * from table3

这给了我一条错误消息:

Too many fields defined.

我还尝试从第一个表中显式选择所有字段名称(为简洁起见添加了省略号):

select [field1],[field2]...[field97] from table1
union all
select * from table2
union all
select * from table3

当我只 UNION 两个这样的表时它工作正常:

select * from table1
union all
select * from table2

这个查询的结果不应该超过 97 个字段;两个表的 UNION 只有 97 个。那为什么我得到 Too many fields 有 3 个表?

编辑:正如 RichardTheKiwi 在下面指出的,Access 正在汇总 UNION 链中每个 SELECT 查询的字段计数,这意味着我的 3 个表超过了 255 个字段的最大值。因此,我需要像这样编写查询:

select * from table1
union all
select * from
(select * from table2
union all
select * from table3)

效果很好。

【问题讨论】:

  • UNIONed 的表需要具有相同数量的字段,并且它们应该具有相同的顺序和相同的类型..
  • @sigil 如果您共享 3 个表的架构,这将非常有助于解决您的问题。不管怎样,Gaby aka 建议这对工会来说真的很重要
  • @Gabyakagpetrioli 它们确实具有相同数量的字段、相同的顺序和相同的类型。当我将任何两张桌子配对时,UNION 工作正常。只是当我做 3 个表时它失败了。
  • 为什么这有 97 列,你的数据库听起来很可怕。此外,这是一个仅使用 * 选择的 3 个表的小提琴:sqlfiddle.com/#!3/7c8d0/2
  • @sigil 评论您的编辑:如果前两个表(表 1 和表 2)有超过 255 个字段,则会给出相同的错误。所以你需要在你的联合中拥有少于 128 个字段

标签: sql ms-access


【解决方案1】:

似乎正在跟踪的字段数(限制为 255)是针对 UNION ALL 的所有部分计算的。所以 3 x 97 = 291,这是多余的。您可能可以将查询创建为包含 2 个部分的 UNION,然后使用该查询和第 3 部分创建另一个查询。

【讨论】:

  • 很高兴了解访问权限。仍然担心它是 97 列。
【解决方案2】:

我有两个表,每个表有 173 个字段(2 x 173 > 255!)。因此,在使用 UNION 语句并使用 JOIN 重新组装生成的输出表之前,我不得不将表分成两半(保留主键)。

    select u1.*, u2.* 
    from (
      select [field1_PKID],[field2],...,[field110] 
      from table1

      union all

      select [field1_PKID],[field2],...,[field110] 
      from table2
      ) as u1
    inner join (
      select [field1_PKID],[field111],...,[field173] 
      from table1

      union all 

      select [field1_PKID],[field111],...,[field173] 
      from table2
      ) as u2
    on [u1].[field1_PKID] = [u2].[field2_PKID]

【讨论】:

  • 多么巧妙的解决方法!谢谢。
【解决方案3】:

也许如果您的 3 个表有重复记录,您可以使用 UNION 而不是 UNION ALL,这可能会减少要跟踪的字段数量。因为 UNION 将始终服务于删除重复项的业务目的。在这种情况下,您的查询将如下所示,

select * from table1
union
select * from table2
union
select * from table3;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多