【问题标题】:ERROR in CREATE VIEW创建视图中的错误
【发布时间】:2013-12-30 17:33:47
【问题描述】:

我尝试在我的 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 语句中的语法错误

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

【问题讨论】:

  • 什么是错误?! 另外,您使用的是什么 DBMS?只是猜测,但如果两个表中都有 threadcategory,那么您就缺少别名。
  • 错误消息的其余部分在哪里?!您还没有告诉我们您使用的是什么 DBMS。
  • 谷歌搜索该错误消息会返回有关 Access 和 Oracle 的线程。您使用的是哪一个(如果有的话)?
  • MySQLSQL ServerPostgresqlOracleSQLite 中工作。有些事你没有告诉我们!!
  • @MartinSmith 这可能会解释它,因为 Access 不支持 CREATE VIEW 语法。

标签: sql ms-access


【解决方案1】:

CREATE VIEW 是在 Access 2000 中与 Jet 4 一起引入的。但是您必须从 ADO/OleDb 执行该语句。如果从 DAO 执行,则会触发错误 3290,“CREATE TABLE 语句中的语法错误”,这更令人困惑而不是有用。

另外CREATE VIEW 只能创建简单的SELECT 查询。对于CREATE VIEW 无法处理的任何问题,请使用CREATE PROCEDURE

但是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;

【讨论】:

    【解决方案2】:

    在这里没有错误消息的情况下,我的假设是你需要一个别名在你的非别名列前面。

    您也可能在将视图命名为新视图时遇到问题。这是对视图或表使用通用名称的问题。尝试给它起一个重要的独特名称。我将以 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 列来匹配以提高连接效率吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-27
      • 2010-11-17
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多