我尝试在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个表。
答案 0 :(得分:2)
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列匹配以使联接更有效?