SQLite / MySQL兼容性问题

时间:2017-05-22 15:00:56

标签: mysql sqlite

我知道SQLite中的SQL没有像在MySql中那样完全实现。我对以下查询的问题是,它们不兼容,我想避免使用条件if <DBMS> ... else

SQLite查询

UPDATE sorties SET state = '#' 
WHERE `key` IN (
  SELECT `key` FROM sorties 
  INNER JOIN reports AS r 
    ON r.sortieId=sorties.`key`);

MySQL上的错误:

  

SQL错误(1093):表'sorties'被指定两次,既作为'UPDATE'的目标又作为单独的数据源

MySQL查询(改编自here

UPDATE sorties AS s SET s.state='#'
WHERE s.`key` IN ( 
  SELECT t.sortieId FROM (
    SELECT r.sortieId AS sortieId
    FROM reports AS r
      INNER JOIN sorties AS sort
        ON sort.`key`=r.sortieId) 
    AS t);

SQLite上的错误:

  

SQLiteManager:可能的SQL语法错误:UPDATE sorties AS s SET s.state ='#'   在哪里。key IN(SELECT t.sortieId FROM(   SELECT DISTINCT r.sortieId AS sortieId   FROM报告AS r   INNER JOIN出动AS排序       ON sort。key = r.sortieId)AS t); [靠近“AS”:语法错误]   例外名称:NS_ERROR_FAILURE   异常消息:组件返回失败代码:0x80004005(NS_ERROR_FAILURE)[mozIStorageConnection.createStatement]

我无法弄清楚如何使这些查询在两个系统上同等运行!

我希望拥有的是,state sorties key reports.sortieId tf.global_variables_initializer() abstract abstract时,char c = 0xFF; printf("%d\n",c<<8); 的每个Node *startN = list->first; printf("Node#%d.string = '%s', .next = '%d' \n",list->first->key, list->first->string, list->first->next->key); ^^^^^^^^^^^ // Same as startN->key ! //iterate through list while(startN->next != NULL) { printf("Node#%d.string = '%s', .next = '%d' \n",startN->key, startN->string, startN->next->key); ^^^^^^^^^^^ // So in first loop you print the same again. startN = startN->next; } 都必须为'{'}。

也许有不同的方法吗?

谢谢

1 个答案:

答案 0 :(得分:0)

第一个命令从子查询中的key表中读取sorties值,然后检查外部语句中sorties表中是否存在这些键值。那张支票是多余的;您可以直接将值与reports中的值进行比较:

UPDATE sorties
SET state = '#'
WHERE key IN (SELECT sortieId
              FROM reports);

对于第二个命令,SQLite不支持对INSERT / UPDATE / DELETE中使用的表进行别名,因为这些命令仅适用于单个表。您只需删除AS s,然后将s替换为sorties