【问题标题】:delete rows using sql 'like' command using data from another table使用 sql 'like' 命令使用另一个表中的数据删除行
【发布时间】:2011-06-04 02:32:23
【问题描述】:

我正在尝试从表(“lovalarm”)中删除行,其中字段(“pointid”)类似于多个字符串中的任何一个。

目前我都是手动输入它们,但是我需要能够拥有超过 100,000 个选项的列表。

我的想法是创建一个包含所有可能字符串的表(“lovdata”)并运行查询以删除字段与其他表中的任何字符串“相似”的行。

谁能指出我是否/如何以这种方式使用的正确方向?

非常感谢, 上限

【问题讨论】:

    标签: sql database oracle database-design


    【解决方案1】:

    只需使用子查询,如下所示:

    DELETE 
      FROM lovalarm
     WHERE pointid IN (SELECT mystring FROM lovdata)
    

    编辑:刚刚注意到 LIKE 是必需的,因此 IN 不起作用,因为这将是完全匹配的。因为文森特已经添加了正确的查询,所以我将把它留在这里以供参考。

    【讨论】:

      【解决方案2】:

      确定您可以使用 LIKE 运算符加入:

      DELETE FROM lovalarm a 
       WHERE EXISTS (SELECT NULL 
                       FROM lovdata d 
                      WHERE a.pointid LIKE d.pointid)
      

      lovdata.pointid 列可能包含通配符,请考虑:

      SQL> CREATE TABLE lovalarm AS
        2  SELECT 'AA' pointid FROM dual
        3  UNION ALL SELECT 'AB' FROM dual
        4  UNION ALL SELECT 'AC' FROM dual
        5  UNION ALL SELECT 'BA' FROM dual
        6  UNION ALL SELECT 'BB' FROM dual
        7  UNION ALL SELECT 'BC' FROM dual;    
      
      Table created
      
      SQL> --# suppose that you want to remove all entries that start
        2  --# with A or end with C
        3  CREATE TABLE lovdata AS
        4  SELECT 'A%' pointid FROM dual
        5  UNION ALL SELECT '%C' FROM dual;
      
      Table created
      
      SQL> DELETE FROM lovalarm a
        2   WHERE EXISTS (SELECT NULL
        3                   FROM lovdata d
        4                  WHERE a.pointid LIKE d.pointid);
      
      4 rows deleted
      
      SQL> select * from lovalarm;
      
      POINTID
      -------
      BA
      BB
      

      【讨论】:

      • 你打败了我!我正要改变我的答案,因为我只是注意到他想使用 LIKE。
      • 请注意,除非d.pointid 实际上包含通配符,否则此LIKE 本质上是一个相等性测试。你可能想要a.pointid LIKE d.pointid||'%'这样的东西。
      • @Dave:我同意,如果没有通配符,LIKE 将被视为相等测试(甚至可能阻止使用有效的访问路径)。我打算添加一个小例子。
      • 就是这样,非常感谢大家的帮助:)
      【解决方案3】:

      这是一个带有 % 连接的示例

      CREATE TABLE LOVALARM(POINTID VARCHAR2(50) ,TXT VARCHAR2(50));
      create table deleteThese(deleteStringList varchar2(50));
      /
      INSERT INTO LOVALARM(POINTID, TXT) VALUES('abc def','1');
      INSERT INTO LOVALARM(POINTID, TXT) VALUES('def','2');
      INSERT INTO LOVALARM(POINTID, TXT) VALUES('abc','3');
      INSERT INTO LOVALARM(POINTID, TXT) VALUES('efd','4');
      INSERT INTO LOVALARM(POINTID, TXT) VALUES('abb','5');
      INSERT INTO LOVALARM(POINTID, TXT) VALUES('efd bbb','6');
      INSERT INTO LOVALARM(POINTID, TXT) VALUES('abb ccc','7');
      INSERT INTO LOVALARM(POINTID, TXT) VALUES('abbbccc','8');
      
      
      INSERT INTO DELETETHESE(DELETESTRINGLIST) VALUES('abc');
      INSERT INTO DELETETHESE(DELETESTRINGLIST) VALUES('bbb');
      
      COMMIT;
      /
      
      DELETE LOVALARM 
       where exists(
                  SELECT NULL
                    FROM DELETETHESE
                   where LOVALARM.pointid like '%' || dELETETHESE.DELETESTRINGLIST  || '%'
              );
      
      select * from LOVALARM;
      
      POINTID                                            TXT                                                
      -------------------------------------------------- -----
      def                                                2                                                  
      efd                                                4                                                  
      ABB                                                5                                                  
      abb ccc                                            7    
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-25
        • 1970-01-01
        • 1970-01-01
        • 2010-12-19
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多