查询输入必须包含至少一个表或查询

Posted

技术标签:

【中文标题】查询输入必须包含至少一个表或查询【英文标题】:Query input must contain atleast one table or query 【发布时间】:2013-05-24 11:40:35 【问题描述】:

我在访问中有一个查询,假设在插入之前检查该项目是否已存在于数据库中:

INSERT INTO FinalizedPrintedStickers
Values('0000846043-481-9-0',
'48IG - 1F Straight Panel                                                        ',
'481                               ',
'0',
'0',
'',
'210',
'Printed')
 WHERE NOT EXISTS(SELECT [SN] FROM FinalizedPrintedStickers Where SN = '0000846043-481-9-0')

现在,我之前遇到过这个错误,但通常是在没有表的情况下,例如,如果您“从测试表中选择 *”并输入“选择 *”并省略 from 子句,您会得到相同的错误。但我有一张桌子?也许我的 where not exists 语法是错误的?

编辑:

好的,我已按照建议添加了一个“双”表,并粘贴了此问题的代码副本:Table-less UNION query in MS Access (Jet/ACE)

尝试添加如图所示的约束给了我这个错误:

按确定后,它会突出显示“检查”一词

我从来没有真正处理过约束(至少在访问中..)我的语法可能是错误的

编辑 2:

使用 ctrl G 命令添加约束

当我按下回车键时...

使用 ADO 添加约束:

当我按下运行时...

【问题讨论】:

你不应该在'values'和括号之间加一个空格吗?不确定是否需要,但值得一试... @JustinKirk 您必须从 ADO 执行 ALTER TABLE。使用CurrentProject.Connection.Execute 我没有使用 ADO,我使用的是 oledb xD ,有没有在访问权限内执行此操作的方法? 如果您不想使用我的 CreateDualTable 过程,您可以通过打开即时窗口 (Ctrl+g) 在 Access 中使用 ADO 执行该语句,将下一条评论中的文本粘贴为一行,然后按回车执行它。 CurrentProject.Connection.Execute "ALTER TABLE Dual ADD CONSTRAINT there_can_be_only_one CHECK ((SELECT Count(*) FROM Dual) = 1);" 【参考方案1】:

这是Dual 表可能有用的情况之一。 Dual 表是一个单行表,当您真的需要源表但 SQL 解析器坚持存在时,可以在查询的 FROM 子句中使用它。

一些数据库系统(例如,Oracle)提供Dual 虚拟表作为“标准设备”,但在 Access 中我们需要创建自己的。有关该过程的精彩描述,请查看 HansUp 的回答 here。

所以,一旦你的 [Dual] 表就位,即

id
--
 1

...那么您可以使用此查询执行您的 INSERT(或不...):

INSERT INTO FinalizedPrintedStickers
    (
        SN,
        Field2
    )
    SELECT 
        "0000846043-481-9-0" AS SN,
        "48IG - 1F Straight Panel" AS Field2
    FROM Dual
    WHERE DCount("SN","FinalizedPrintedStickers","SN=""0000846043-481-9-0""")=0

【讨论】:

您确定查询正确吗?选择“0000846043-...” from dual 将始终返回 false,因为 dual 中没有记录.. 不会吗? @JustinKirk 不,Dual 表中应该始终只有 一个 记录。 @JustinKirk Gord 提到的 Dual table 包含一个检查约束,可确保 table 始终只包含一行。【参考方案2】:

试试这个你可以使用简单的where子句

INSERT INTO FinalizedPrintedStickers
    Values('0000846043-481-9-0',
    '48IG - 1F Straight Panel                                                        ',
    '481                               ',
    '0',
    '0',
    '',
    '210',
    'Printed')
     WHERE SN Not In(SELECT [SN] FROM FinalizedPrintedStickers Where SN = '0000846043-481-9-0');

【讨论】:

FinalizedPrintedStickers 这个表是否存在/ 删除表中重复条目所需的子句。? 请检查NOT IN子句 它只是用某种语言查询或查询。VB,C#? 取自C#代码,但我在实际访问中测试查询

以上是关于查询输入必须包含至少一个表或查询的主要内容,如果未能解决你的问题,请参考以下文章

Access VBA:查询输入必须至少包含一个表或查询

“查询输入必须至少包含一个表或查询”添加“INSERT INTO”语句时出错

如何在 MS Access 中向 SQL 查询添加自定义行?

在 VBA 中不存在的地方使用插入

springdataJpa对无主键表或视图查询的支持

springdataJpa对无主键表或视图查询的支持