【问题标题】:Is EXISTS clause supported by DBISAM's sql engine?DBISAM 的 sql 引擎是否支持 EXISTS 子句?
【发布时间】:2014-11-26 12:37:03
【问题描述】:

奇怪的是,EXISTS 的 sql 引擎似乎不支持 EXISTS 子句,因为它总是导致 SQL 错误。以下是使用 EXISTS 的示例。我在这里有什么遗漏吗?

update Table1 set HASXACTION = False
WHERE EXISTS (SELECT SERIALID
              From Table2  
              LEFT JOIN Table1 ON (Table2 .AUXILACT = Table1 .CODE) 
                               AND (Table2 .CHARTACT = Table1 .CHARTACT) )

【问题讨论】:

  • 错误是什么?例如,这种语法在 MySQL 上是不允许的。
  • DBISAM支持EXISTS语句,所以问题出在你的查询...
  • 我发布了我在使用 DISAM 本身的数据库实用工具时遇到的错误的屏幕截图。
  • @whosrdaddy,请注意,同样的 SQL 语句可以在 BDE 的 sql 引擎中正常工作。
  • SELECT 查询有效吗?

标签: sql dbisam


【解决方案1】:

没关系,我刚刚了解到 DBISAM 不支持 EXISTS 运算符来指定 WHERE 子句中的子选择谓词。它记录在 DBISAM 的帮助文件中(附截图)。

【讨论】:

  • 嗯,这也完美地回答了我的问题。我一直在寻找一种更快的方法来做不同的,。但似乎不会飞。
【解决方案2】:

我认为您并不真正想要子查询中的join。您可能打算使用相关子查询:

UPDATE Table1
    SET HASXACTION = False
    WHERE EXISTS (SELECT SERIALID
                  FROM Table2  
                  WHERE Table2.AUXILACT = Table1.CODE AND Table2.CHARTACT = Table1.CHARTACT
                 );

这也应该解决您遇到的问题,即在 update 子句和子查询中对 Table1 的引用。 (这是 MySQL 的限制。)

编辑:

我找不到任何对 dbisam 的 EXISTS(甚至是子查询)的引用。但是,您可以使用连接进行更新,所以这应该是等效的:

UPDATE Table1
    SET HASXACTION = False
    FROM Table1 JOIN
         Table2
         ON Table2.AUXILACT = Table1.CODE AND Table2.CHARTACT = Table1.CHARTACT;

【讨论】:

  • 虽然 ElevateDB 支持关联子查询,但 DBISAM 不支持。
  • 嗯,MySQL? DBIsam 是 Elevate Software 的专有数据库引擎,我认为与 MySQL 没有任何联系。
【解决方案3】:

正如您已经发现的那样,您可以使用 IN 来完成。但是,存在一个限制,即 IN 只能与一个字段一起使用。因此,您可以通过连接两个字段来制作符合条件的表达式来绕过它。一个用于内部,一个用于外部。

update Table1 set HASXACTION = False
WHERE Code+'.'+CHARTACT IN 
 (  
   SELECT  AUXILACT+'.'+CHARTACT From Table2
 )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    相关资源
    最近更新 更多