【问题标题】:Remove rows where column exists in select statement删除 select 语句中存在 column 的行
【发布时间】:2018-10-19 23:20:21
【问题描述】:

我想删除 select 语句中存在特定列的行,例如:

delete from [ProjectCustomer] pcc 
where ProjectKey in (
  select p.ProjectKey  
  FROM [Project] AS [p] inner JOIN [ProjectDesign] AS [pd] ON [p].[ProjectKey] = [pd].[ProjectKey]
  inner JOIN [Design] AS [d] ON [pd].[DesignKey] = [d].[DesignKey]
  inner JOIN [ProjectCustomer] AS [pc] ON [pc].[ProjectKey] = [p].[ProjectKey]
  inner join Customer as c on pc.CustomerKey = c.CustomerKey
  where d.Folio = 3014)

但是在 delete 语句的 where 子句中我得到了

where 子句附近的语法不正确

我做错了什么?问候

【问题讨论】:

  • 您能否为上述查询添加足够的数据库架构以引用现有的表和列名?它可能会帮助我诊断您的问题。
  • 应该是delete pcc from [ProjectCustomer] pcc
  • 尝试删除 pcc 别名,因为您不使用它。

标签: sql sql-server tsql


【解决方案1】:

具有表别名的 DELETE 语句具有不同的语法,因此您可以删除未使用的别名或更改删除语句,如 @Martin 评论。

delete pcc from [ProjectCustomer] pcc

我会准备使用INNER JOIN 而不是IN 来修改查询

delete pcc from [ProjectCustomer] AS pcc 
  inner join [Project] AS [p] ON [p].ProjectKey = [pcc].ProjectKey
  inner JOIN [ProjectDesign] AS [pd] ON [p].[ProjectKey] = [pd].[ProjectKey]
  inner JOIN [Design] AS [d] ON [pd].[DesignKey] = [d].[DesignKey]
  inner JOIN [ProjectCustomer] AS [pc] ON [pc].[ProjectKey] = [p].[ProjectKey]
  inner join Customer as c on pc.CustomerKey = c.CustomerKey
  where d.Folio = 3014)

【讨论】:

    【解决方案2】:

    我认为错误信息是

    “pcc”附近的语法不正确

    而不是

    where 子句附近的语法不正确

    您将收到第一条错误消息,因为您使用了错误的别名,所以当您没有加入目标表时,您可能需要

    delete from [ProjectCustomer]
    where ProjectKey in (
      select p.ProjectKey  
      FROM [Project] AS [p] inner JOIN [ProjectDesign] AS [pd] ON [p].[ProjectKey] = [pd].[ProjectKey]
      inner JOIN [Design] AS [d] ON [pd].[DesignKey] = [d].[DesignKey]
      inner JOIN [ProjectCustomer] AS [pc] ON [pc].[ProjectKey] = [p].[ProjectKey]
      inner join Customer as c on pc.CustomerKey = c.CustomerKey
      where d.Folio = 3014);
    

    或者即使你仍然想使用别名

    delete pcc from [ProjectCustomer] pcc
    where pcc.ProjectKey in ...
    

    【讨论】:

      【解决方案3】:

      您可能可以稍微简化您的查询。我认为您不需要子查询,您可以在第一个 FROM 子句中指定要从中删除的表(没有别名),然后在第二个中加入表(根据需要使用别名):

      DELETE FROM ProjectCustomer
      FROM ProjectCustomer pc
        INNER JOIN ProjectDesign pd ON pc.ProjectKey = pd.ProjectKey
          INNER JOIN Design d ON pd.DesignKey = d.DesignKey
      WHERE d.Folio = 3014;
      

      CustomersProducts 表不应该是必需的,只要您设置了参照完整性并且 pc.CustomerKey 不可为空。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-04
        • 2022-12-18
        • 1970-01-01
        • 1970-01-01
        • 2015-10-08
        • 2019-11-23
        相关资源
        最近更新 更多