创建视图中的错误

时间:2013-12-30 17:33:48

标签: sql ms-access

我尝试在MS Access数据库中创建一个新视图,以便我可以更好地从中选择,但我想知道这里发生了什么。

CREATE VIEW new 
AS 
  SELECT msthread.id, 
         msthread.threadname, 
         Count(msthread.threadname) AS TotalPost, 
         threadcategory 
  FROM   msthread 
         LEFT OUTER JOIN msposts 
                      ON msthread.threadname = msposts.threadname 
  GROUP  BY msthread.id, 
            msthread.threadname, 
            msthread.threadcategory 
当我尝试执行该语句时,

Access会给我这个错误消息。

  

create table statement

中的语法错误

使用JOIN创建视图时是否存在特定问题?我正在尝试访问2个表。

2 个答案:

答案 0 :(得分:2)

在Access 2000中使用Jet 4引入了

CREATE VIEW。但是您必须从ADO / OleDb执行语句。如果从DAO执行,它会触发错误3290," CREATE TABLE语句中的语法错误" ,这比有用的更令人困惑。

同样CREATE VIEW只能创建简单的SELECT个查询。对CREATE PROCEDURE无法处理的任何内容使用CREATE VIEW

CREATE VIEW应该处理你的问题。我使用字符串变量来保存下面的DDL语句,然后在Access会话中从CurrentProject.Connection执行它:

CurrentProject.Connection.Execute strSql

这很有效,因为CurrentProject.Connection是一个ADO对象。如果您将从Access外部执行此操作,请使用OleDb连接。

注意我对您的查询进行了一些更改。大多数都很小。但我认为更改查询名称可能很重要。 New是保留字,因此我选择了qryNew。在从ADO / OleDb运行的查询中,保留字作为对象名称似乎特别麻烦。

CREATE VIEW qryNew
AS
SELECT
    mst.id,
    mst.threadname,
    mst.threadcategory,
    Count(mst.threadname) AS TotalPost
FROM
    msthread AS mst
    LEFT JOIN msposts AS msp
    ON mst.threadname = msp.threadname
GROUP BY
    mst.id,
    mst.threadname,
    mst.threadcategory;

答案 1 :(得分:1)

在没有错误消息的情况下走出去,但我的假设是你需要在非别名列前面添加别名。

您可能还会将视图标题为新视图。对于视图或表使用通用名称是一个问题。尝试给它一个重要的独特名称。我将以msThreadPosts为例。

CREATE VIEW msThreadPosts 
AS 
  SELECT msthread.id, 
         msthread.threadname, 
         Count(msthread.threadname) AS TotalPost, 
         msposts.threadcategory --Not sure if you want msposts or msthread just pick one
  FROM   msthread 
         LEFT OUTER JOIN msposts 
                      ON msthread.threadname = msposts.threadname 
  GROUP  BY msthread.id, 
            msthread.threadname, 
            msthread.threadcategory 

只要我们查看此查询,就可以修复一些其他正在以愚蠢的方式完成的事情。

让我们从别名开始。如果您为列添加别名,则可以非常轻松地使您的查询易于理解,并向倾向于阅读它的任何人阅读。

CREATE VIEW msThreadPosts 
AS 
  SELECT mt.id, 
         mt.threadname, 
         Count(mt.threadname) AS TotalPost, 
         mp.threadcategory 
  FROM   mtas mt
         LEFT OUTER JOIN msposts mp
                      ON mt.threadname = mp.threadname 
  GROUP  BY mt.id, 
            mt.threadname, 
            mt.threadcategory 

现在看起来并没有那么好看。

接下来要看你的列名。 msthread有一个id列。该列名称非常通用。当列没有别名并且在多个位置存在id或者存在多个id列时,这可能会导致问题。现在,如果我们将该列名更改为msthreadID,它会使事情变得更加清晰。我们的目标是以一种方式设计您的表,任何在您的数据库上工作的人都可以知道列正在做什么。

接下来要看的是你的加入。你为什么加入线程名称? threadname可能是一个字符串,因此对于连接而言效率不高。如果msthread作为id列并且需要加入msposts,那么msposts是否也应该将该id列匹配以使联接更有效?