UNION ALL查询:"定义的字段太多"

7

我正在尝试获取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

当我只联接两个表时,它的运行正常,例如:

select * from table1
union all
select * from table2

这个查询的结果不应该超过97个字段;两个表的UNION只有97个。那么为什么我使用三个表时会出现“字段太多”的错误?
编辑:如下面RichardTheKiwi所述,Access正在对UNION链中每个SELECT查询的字段计数求和,这意味着我的3个表超过了255个字段的最大限制。因此,我需要像这样编写查询:
select * from table1
union all
select * from
(select * from table2
union all
select * from table3)

这工作很好。


2
被“UNION”合并的表格需要具有相同数量的字段,并且它们应该按照相同的顺序和类型排列。 - Gabriele Petrioli
@sigil 如果您分享您的三个表的架构,那将非常有助于解决您的问题。无论如何,Gaby aka建议的任何内容都对联合非常重要。 - Smit
@Gabyakagpetrioli 它们具有相同数量的字段,相同的顺序和相同的类型。当我将任意两个表配对时,“UNION”可以正常工作。只是当我使用3个表时它会失败。 - sigil
为什么这个有97列,你的数据库听起来很可怕。此外,这里有一个使用仅*选择在3个表中运行的小工具:http://sqlfiddle.com/#!3/7c8d0/2 - Woot4Moo
@sigil 对你的编辑进行评论:如果前两个表(即table1和table2)有超过255个字段,它将会给出相同的错误。因此,在union all中需要少于128个字段。 - onur rr
3个回答

12

目前看来,正在跟踪的字段数量(限制为255)被计入联合查询所有部分。所以3个部分 x 97个字段 = 291,超过了最大值。你可以创建一个联合查询包含两个部分,然后再创建一个包含第三个部分的查询。


了解访问权限是很好的。但仍然有点担心它有97列。 - Woot4Moo

1
我有两个表,每个表有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]

多么巧妙的解决方法!谢谢。 - NewSites

0

如果您的三个表存在重复记录,您可以使用 UNION 而不是 UNION ALL,这样可以减少要跟踪的字段数量。因为 UNION 始终可以满足业务需求,它会去除重复项。在这种情况下,您的查询将如下所示:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接