【问题标题】:Sql - SQL Error [156] [S1000]: Incorrect syntax near the keyword 'as'Sql - SQL 错误 [156] [S1000]:关键字“as”附近的语法不正确
【发布时间】:2019-02-25 09:20:44
【问题描述】:

以下是我的查询 -

DELETE
FROM activity_details as ad, edit_details as ed
LEFT JOIN edit_details as ed
ON ed.details_id = ad.row_id
WHERE year(ad.activity_datetime)  = year(GETDATE())-10

我收到错误 SQL 错误 [156] [S1000]:关键字“as”附近的语法不正确。 SQL 错误 [156] [S1000]: 关键字 'as' 附近的语法不正确。

你能帮我改一下语法吗

【问题讨论】:

标签: sql-server mssql-jdbc


【解决方案1】:

如下更改。如果您在删除语句中使用FROM,则需要使用alias 名称进行删除。

DELETE ad
FROM activity_details as ad
LEFT JOIN edit_details as ed
ON ed.details_id = ad.row_id
WHERE year(ad.activity_datetime)  = year(GETDATE())-10

【讨论】:

  • 我还需要从 ed 中删除行,其中 ad 的 rowid 是 ed 的 activityid
  • SQL Server 只允许在一个语句中删除一个表,不能使用单个语句从多​​个表中删除行,如果要删除多个,可以将数据存储在临时表中并执行两个单独的删除语句。如果您愿意,可以将这些语句包装在事务中。
  • 那么我们如何处理外键约束......因为edit detaills有一个引用rowid的外键
  • 如果要进行CASCADE DELETE,应该在FK中定义,可以在这里查看更多细节stackoverflow.com/questions/6260688/…
【解决方案2】:

在delete之后添加别名

 DELETE ad
    FROM activity_details as ad
    LEFT JOIN edit_details as ed
    ON ed.details_id = ad.row_id
    WHERE year(ad.activity_datetime)  = year(GETDATE())-10

【讨论】:

    【解决方案3】:

    您需要在删除子句中使用别名,然后拥有FROM。我还建议反对 year(ad.activity_datetime) 并使用 SARGable 查询:

    DELETE ad
    FROM activity_details ad
         LEFT JOIN edit_details ed ON ed.details_id = ad.row_id
    WHERE ad.activity_datetime >= DATEADD(YEAR,DATEDIFF(YEAR, 0, GETDATE()-10),0)
      AND ad.activity_datetime < DATEADD(YEAR,DATEDIFF(YEAR, 0, GETDATE()-9),0);
    

    【讨论】:

    • 我还需要根据 ed.details_id = ad.row_id 从 ed 中删除
    • @shreya SQL Server 不会影响具有单个 DDL 语句的多个表。您将需要发出 2 个DELETE 语句或实施级联。但为什么你的问题中有这些细节?
    • 所以还有另一个表edit_details,其外键为活动id,引用rowid
    • @shreya 这不会改变我的上述评论。 SQL Server 仍然不允许您使用单个 DELETE 影响多个表。
    • 那么我们如何处理外键删除
    【解决方案4】:

    您需要从查询中删除别名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 2016-06-08
      • 2019-05-07
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多