удалить строки с помощью команды sql like, используя данные из другой таблицы - PullRequest
3 голосов
/ 05 января 2011

Я пытаюсь удалить строки из таблицы ("lovalarm"), где поле ("pointid") похоже на любую из нескольких строк.

В настоящее время я ввожу их все вручную, однако мне нужно иметь список из 100 000 вариантов.

Я думаю, что у меня есть таблица ("lovdata"), содержащая все возможные строки и выполняющая запрос для удаления строк, где поле "похоже" на любую из строк в другой таблице.

Может ли кто-нибудь указать мне правильное направление, если / как я могу использовать, как таким образом?

Большое спасибо, Cap

Ответы [ 3 ]

7 голосов
/ 05 января 2011

уверен, что вы можете присоединиться к оператору 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
2 голосов
/ 05 января 2011

Просто используйте подзапрос, например:

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

РЕДАКТИРОВАТЬ: Только что заметил, что LIKE требуется, поэтому IN не будет работать, поскольку это будет точное совпадение. Я оставлю это здесь для справки, поскольку Винсент уже добавил правильный запрос.

1 голос
/ 05 января 2011

вот пример с% конкатенаций

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    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...