【问题标题】:How do I delete one record matching some criteria in SQL? (Netezza)如何删除一条符合 SQL 中某些条件的记录? (内特扎)
【发布时间】:2011-12-17 11:50:31
【问题描述】:

我的表中有一些重复记录,因为事实证明 Netezza 不支持对主键进行约束检查。话虽如此,我有一些信息完全相同的记录,我只想删除其中一个。我试过了

delete  from table_name where test_id=2025 limit 1

还有

delete  from table_name where test_id=2025 rowsetlimit 1

但是这两个选项都不起作用。我收到一个错误提示

found 'limit'. Expecting a keyword

有没有办法限制这个查询删除的记录?我知道我可以删除记录并重新插入,但这有点乏味,因为我必须多次这样做。

请注意,这不是 SQL Server 或 MySQL。这是为 Netezza 准备的

【问题讨论】:

    标签: sql netezza


    【解决方案1】:

    如果它不支持“DELETE TOP 1”或“LIMIT”关键字,您最终可能不得不执行以下操作之一:

    1) 添加某种自动递增的列(如 ID),使每一行都是唯一的。不过,我不知道您是否可以在创建表后在 Netezza 中执行此操作。

    2) 使用某种编程语言以编程方式读取整个表,以编程方式消除重复项,然后删除所有行并再次插入它们。如果它们被其他表引用,这可能是不可能的,在这种情况下,您可能必须暂时删除约束。

    我希望这会有所帮助。请告诉我们。

    供日后参考;这就是为什么我个人总是创建一个自动递增的 ID 字段,即使我认为我永远不会使用它。 :)

    【讨论】:

    • 这有帮助。我不喜欢坏消息,但我想我不能责怪信使。谢谢。
    【解决方案2】:

    以下查询适用于从表中删除重复项。

    DELETE FROM YOURTABLE 
    WHERE COLNAME1='XYZ' AND 
    (
    COLNAME1,
    ROWID
    )   
    NOT IN
    (
    SELECT COLNAME1,
           MAX(ROWID)
    FROM YOURTABLENAME
    WHERE COLNAME = 'XYZ'
    GROUP BY COLNAME1
    )
    

    【讨论】:

      【解决方案3】:

      如果记录相同,那么您可以执行类似的操作

      CREATE TABLE DUPES as
      SELECT col11,col2,col3,col....... coln from source_table where test_id = 2025
      group by 
      1,2,3..... n
      
      DELETE FROM source_table where test_id = 2025
      
      INSERT INTO Source_table select * from duoes
      
      DROP TABLE DUPES
      

      您甚至可以创建一个子查询来选择所有的 test_ids HAVING COUNT(*) > 1 来自动找到步骤 1 和 3 中的骗子

      【讨论】:

      • 这不只是将重复项插入到新表中,然后将重复项重新插入到我的原始表中吗?我喜欢这个想法的基本原理
      【解决方案4】:
        -- remove duplicates from the <<TableName>> table
        delete from <<TableName>> 
        where rowid not in 
        (
          select min(rowid) from <<TableName>>
          group by (col1,col2,col3) 
        );
      

      【讨论】:

        【解决方案5】:

        GROUP BY 1,2,3,....,n 将消除插入临时表时的欺骗

        【讨论】:

          【解决方案6】:

          Netezza 中是否允许使用 rowid...据我所知,我认为此查询不会在 Netezza 中执行...

          【讨论】:

            猜你喜欢
            • 2019-11-24
            • 1970-01-01
            • 2019-06-09
            • 2022-08-16
            • 2017-11-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-12-12
            相关资源
            最近更新 更多