【问题标题】:How can I remove a record when it has a higher level on column with SQL oracle?当记录在 SQL oracle 的列上具有更高级别时,如何删除记录?
【发布时间】:2018-03-27 11:46:44
【问题描述】:

例如: 我有两种情况

  card cardholder level
    1     1         1
    1     1         2
    1     1         3

  card cardholder level

    1     1         2
    1     1         3

在这两种情况下,我只想要第一条记录。

我得到了类似的东西,但没有返回预期的结果:

delete from table
    where card in (select card from (
    select cardholder, card, count(card), count(cardholder) from table
    group by cardholder, card
    having COUNT (card) > 1))
    and level = '3'
    ;

【问题讨论】:

  • 你的表中没有主键吗?
  • 如果您没有 PK,您唯一可以关闭的就是添加一个 order by card, cardholder, level,您还需要添加一个 LIMIT,共 1 个
  • @schlonzo 我有一个表 ID 作为 PK。

标签: sql oracle sql-delete


【解决方案1】:

使用相关的DELETE 与每张卡、持卡人组合的MIN 级别值进行比较。我已将level 列更改为lvl,因为level 是Oracle 关键字。

DELETE
FROM tab1 t
WHERE EXISTS (
        SELECT 1
        FROM (
            SELECT card
                ,cardholder
                ,MIN(lvl) AS lvl
            FROM tab1
            GROUP BY card
                ,cardholder
            ) s
        WHERE t.card = s.card
            AND t.cardholder = s.cardholder
            AND
         t.lvl > s.lvl
        );

Demo

不完全清楚你的意思是什么

“我只想要第一条记录”。

我假设它是MIN

如果您有一个ID PK 列,并且您的第一条记录表示 id 最少的记录,那么您可以使用 KEEP..DENSE_RANKMIN(lvl)

MIN(lvl) KEEP ( DENSE_RANK FIRST ORDER BY ID )

【讨论】:

  • 感谢您的回复。你的假设是正确的 :) 我想要最小值。
  • @Wiz : 不客气..如果对你有帮助,请告诉我。
  • 是的。它有帮助!
【解决方案2】:

如果您想留下具有最​​小'level' 值的记录,您可以使用以下查询:

DELETE FROM table t WHERE EXISTS (SELECT 1 table t2 WHERE t2.level < t.level)

【讨论】:

  • 只有当配对卡和持卡人超过1级时才能移除。
  • 所以请试试这个:DELETE FROM table t WHERE card > 1 and cardholder > 1
  • 嗯,这没有任何意义......我猜。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 2021-12-10
  • 2021-09-28
  • 1970-01-01
  • 2017-05-08
相关资源
最近更新 更多