【问题标题】:How delete table inner join with other table in Sqlite?如何在 Sqlite 中删除表内连接与其他表?
【发布时间】:2014-08-22 01:34:48
【问题描述】:

我的查询:

DELETE a FROM TR_ContactResultRecord  a
INNER JOIN TR_Case  b on (a.FireStationCode=b.FireStationCode and a.CaseNo=b.CaseCode )
WHERE b.Update_DateTime <=20140628134416

显示错误:[Err] 1 - near "a": syntax error

Sqlite中如何删除表内连接与其他表?

【问题讨论】:

  • 不幸的是,Sqlite 不接受这种语法,因为它与 sql server 不同。
  • PostgreSQL 文档建议 DELETE JOIN 不是 SQL 标准的一部分顺便说一句:postgresql.org/docs/14/sql-delete.html“这种语法不是标准的。更标准的方法是”与IN。但是它也指出“在某些情况下,连接样式比子选择样式更容易编写或执行更快。”所以遗憾的是 SQLite 不支持它,即使只是为了更好的可移植性。更新相关:stackoverflow.com/questions/19270259/update-with-join-in-sqlite

标签: sqlite


【解决方案1】:

尝试使用子查询重写您的查询:如果您的 TR_ContactResultRecord 的 PK 是 CaseNo

DELETE FROM TR_ContactResultRecord
WHERE CaseNo IN (
  SELECT CaseNo FROM TR_ContactResultRecord a
  INNER JOIN TR_Case b
    ON (a.FireStationCode=b.FireStationCode and a.CaseNo=b.CaseCode )
  WHERE b.Update_DateTime <=20140628134416
);

【讨论】:

  • 哦,所以 SQLite 不喜欢 DELETE FROM table JOIN ...
  • 我也收到这个错误,看来sqlite不支持删除内连接
  • select 语句应该是 a.CaseNo 而不是 CaseNo。否则很好的答案!
  • @Optavius:a.CaseNo 或 CaseNo 没问题。因为在b表中没有CaseNo列。
【解决方案2】:

默认情况下,SQLite 在每个表中都有特殊的 ROWID 列。来自官方documentation

您可以使用特殊列名 ROWID、_ROWID_ 或 OID 之一访问 SQLite 表的 ROWID。除非您声明一个普通表列使用这些特殊名称之一,否则该名称的使用将引用声明的列而不是内部 ROWID。

代码如下:

DELETE FROM TR_ContactResultRecord
WHERE ROWID IN (
  SELECT a.ROWID FROM TR_ContactResultRecord a
  INNER JOIN TR_Case b
    ON (a.FireStationCode=b.FireStationCode and a.CaseNo=b.CaseCode )
  WHERE b.Update_DateTime <=20140628134416
);

【讨论】:

  • 同意。从长远来看,绝对是性能最好的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 2015-08-01
  • 2021-02-17
  • 2019-07-17
  • 1970-01-01
相关资源
最近更新 更多