我在MS Access(2003)中有一个使用子查询的查询。子查询部分如下所示:
...FROM (SELECT id, dt, details FROM all_recs WHERE def_cd="ABC-00123") AS q1,...
当我切换到Table View以验证结果时,一切正常。
然后,我希望将此查询的结果打印在报表的页眉上(查询返回单行,即页面标题内容)。我收到错误,因为查询突然重写为:
...FROM [SELECT id, dt, details FROM all_recs WHERE def_cd="ABC-00123"; ] AS q1,...
所以圆形括号自动替换为方括号是好的,Access认为它需要这样做,很好!但是为什么将;
添加到子查询中会导致它失败?
我想我可以为这些子查询创建新的查询对象,但是我应该 来做这件事似乎有点傻。
答案 0 :(得分:3)
啊,Access的乐趣。查询设计器通常不能很好地使用派生表。实际上有不止一些结构,Jet会在查询设计器中无法正确查看。事实上,QBE会破坏许多这些复杂的查询(如你所见)。通常,您应该简单地假设您无法在QBE中安全地查看派生表或“复杂”查询的设计,而只能在代码中查看。
答案 1 :(得分:3)
如果要使用更标准的派生表语法,则需要切换到SQL 92模式。但是,请注意这也会将您的通配符更改为与SQL-Server兼容(%和_而不是*和?)。
正如@HansUp指出的那样,SQL中的错误不是“;”但在收盘方括号后缺乏尾随期。只要我一直在使用派生表(它将回到A97左右),那个语法就是Jet的一部分。它有防止派生表SQL中需要方括号的任何表达式(例如其中包含空格的字段名称)的缺陷,但我不认为这是一个可怕的缺陷,因为我避免以需要方括号的方式命名事物
编辑:
另请注意,SQL 92模式还存在其他问题,在this post of mine末尾的编辑中进行了概述。
答案 2 :(得分:1)
我已经看到了你所描述的Access用子方括号替换子查询括号的地方。但是我从来没有注意到它在子查询后添加了分号。
另一个细节是,使用方形支持,您的查询将遵循以下模式:
... FROM [ SELECT whatever FROM someTable ]. AS q ...
请注意关闭方括号后面的点。您的样本不包含点。所以我想知道如果添加点并删除分号(在SQL视图中)会发生什么,如下所示:
...FROM [SELECT id, dt, details FROM all_recs WHERE def_cd="ABC-00123" ]. AS q1,...
Access是否接受该更改,并且在通过查询设计器进行任何进一步更改时是否保留了该更改?