【问题标题】:Delete Rows which are fetched by a select query joining several tables删除由连接多个表的选择查询获取的行
【发布时间】:2021-07-05 06:16:10
【问题描述】:

我已经写了以下选择:

SELECT r.ID, r.NAME, r.REMARK, u.user_id, u.deadline, u.creation_date, d.NEXT_TEST_DATE, t.TEST_INTERNAL_EXTERNAL FROM reminder r, reminder_users u, device d, device_test t where r.id = u.reminder_id and u.receipt = 0 and (regexp_replace(r.origin_values, '[^0-9]', '')) = d.id and d.NEXT_TEST_INT_ID = t.id  and t.TEST_INTERNAL_EXTERNAL = 0 and r.NAME like '%Interne%' and r.NAME not like '%Externe%' and u.deadline <> d.NEXT_TEST_DATE_INTERNAL and u.DEADLINE > sysdate GROUP BY r.ID, r.NAME, r.REMARK, u.user_id, u.deadline, u.audt_creation_date, d.NEXT_TEST_DATE_INTERNAL, t.TEST_INTERNAL_EXTERNAL ORDER BY u.deadline;

我想要做什么:我想删除提醒中的行,这些行由描述的选择获取。

我尝试了什么:

DELETE from REMINDER where id in (SELECT r.ID, r.NAME, r.REMARK, u.user_id, u.deadline, u.audt_creation_date, d.NEXT_TEST_DATE_INTERNAL, t.TEST_INTERNAL_EXTERNAL FROM reminder r, reminder_users u, device d, device_test t where r.id = u.reminder_id and u.receipt = 0 and (regexp_replace(r.origin_values, '[^0-9]', '')) = d.id and d.NEXT_TEST_INT_ID = t.id  and t.TEST_INTERNAL_EXTERNAL = 0 and r.NAME like '%Interne%' and r.NAME not like '%Externe%' and u.deadline <> d.NEXT_TEST_DATE_INTERNAL and u.DEADLINE > sysdate GROUP BY r.ID, r.NAME, r.REMARK, u.user_id, u.deadline, u.audt_creation_date, d.NEXT_TEST_DATE_INTERNAL, t.TEST_INTERNAL_EXTERNAL ORDER BY u.deadline);

结果:00907. 00000 - "missing right parenthesis"

我想知道我是否可以以这种方式基本上删除这些行。我也试过'exists'导致同样的错误。

有什么建议吗?提前致谢!

【问题讨论】:

  • JOINJOINJOIN.

标签: sql oracle join sql-delete


【解决方案1】:

从您的子查询中删除 order by 子句,它应该可以工作:

DELETE from BSRMD_REMINDER where id in (SELECT r.ID FROM bsrmd_reminder r, bsrmd_reminder_users u, bsdev_device d, bsdev_device_test t where r.id = u.reminder_id and u.receipt = 0 and (regexp_replace(r.origin_values, '[^0-9]', '')) = d.id and d.NEXT_TEST_INT_ID = t.id  and t.TEST_INTERNAL_EXTERNAL = 0 and r.NAME like '%Interne%' and r.NAME not like '%Externe%' and u.deadline <> d.NEXT_TEST_DATE_INTERNAL and u.DEADLINE > sysdate GROUP BY r.ID, r.NAME, r.REMARK, u.user_id, u.deadline, u.audt_creation_date, d.NEXT_TEST_DATE_INTERNAL, t.TEST_INTERNAL_EXTERNAL );

或者更好用的存在:

  DELETE from BSRMD_REMINDER 
where exists 
(
    SELECT 1 
    FROM bsrmd_reminder r, bsrmd_reminder_users u, bsdev_device d, bsdev_device_test t 
    where r.id = u.reminder_id and u.receipt = 0 and (regexp_replace(r.origin_values, '[^0-9]', '')) = d.id 
    and d.NEXT_TEST_INT_ID = t.id  and t.TEST_INTERNAL_EXTERNAL = 0 and r.NAME like '%Interne%' and r.NAME not like '%Externe%' 
    and u.deadline <> d.NEXT_TEST_DATE_INTERNAL and u.DEADLINE > sysdate 
    AND BSRMD_REMINDER.ID=r.ID
    GROUP BY r.ID, r.NAME, r.REMARK, u.user_id, u.deadline, u.audt_creation_date, 
    d.NEXT_TEST_DATE_INTERNAL, t.TEST_INTERNAL_EXTERNAL 
);

**请再次检查所有这些连接是否真的有必要。

【讨论】:

  • IN 版本将引发异常,因为一列 (id) 与多列进行比较。
  • 是的,IN 版本引发了“太多值”。并且存在-版本仍然“缺少右括号”-存在错误。
  • 非常抱歉!这是非常不负责任的回答。我已经修改了我的两个答案。请立即检查。
  • 删除复杂查询的最佳方法是在结果中包含rowid 列并使用in 谓词。它不依赖于数据模型,因此没有技巧来找出具有身份角色的列
猜你喜欢
  • 2017-11-26
  • 2014-03-03
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
相关资源
最近更新 更多