【问题标题】:How to delete records from a table having IN,Group By and Having with more than 1000 records in IN clause如何从具有 IN、Group By 和 IN 子句中有超过 1000 条记录的表中删除记录
【发布时间】:2016-04-24 17:11:46
【问题描述】:

需要使用IN子句从表中删除数据,但IN子句中的记录超过1000条。查询有Group by和Having,表中的列太多!所以我不确定如何使用 TEMP 表。

查询是:

  DELETE * FROM test WHERE order_num IN( 
  select order_num 
  FROM test
  WHERE TO_DATE (mod_dt) BETWEEN TO_DATE ('11-JUN-15') AND TO_DATE ('17-JUL-15')
  AND REGION = 'AK'
  GROUP BY order_num
  HAVING COUNT(order_Num) > 1) ; 

【问题讨论】:

  • 到底是什么问题?
  • IN子句的记录数超过1000条,报错!
  • mysql, sql-server, oracle 它们都是不同的产品,请用您正在使用的正确产品标记您的问题。
  • 我认为没有行会导致错误。试一试,然后去做吧
  • TO_DATE ('11-JUN-15') 缺少其格式掩码。你不应该在没有 TO_DATE() 的情况下使用它,因为这意味着你仍然依赖默认的 NLS_DATE_FORMAT 参数来决定如何将字符串转换为日期 - 这不是一件好事!此外,年份有 4 位数字,而不是 2 位(Y2K 很久以前不是那个......是吗?!)。你应该改用TO_DATE ('11/06/2015', 'dd/mm/yyyy') 之类的东西。

标签: mysql sql sql-server oracle


【解决方案1】:

我认为您不需要 Group by 和从句,是吗?

您可以使用公用表表达式:

;WITH CTE AS (
    SELECT top 1000 * FROM test WHERE order_num IN( 
      select order_num 
      FROM test
      WHERE TO_DATE (mod_dt) BETWEEN TO_DATE ('11-JUN-15') AND TO_DATE ('17-JUL-15')
      AND REGION = 'AK') )

delete *
from CTE;

【讨论】:

    猜你喜欢
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 2018-04-22
    • 2022-01-16
    • 2016-06-29
    相关资源
    最近更新 更多