2011-01-05 9 views
3

フィールド( "pointid")が複数の文字列のいずれかと同じテーブル( "lovalarm")から行を削除しようとしています。他のテーブルからのデータを使用してsql 'like'コマンドを使用して行を削除する

現在、私はすべて手動で入力していますが、100,000を超えるオプションのリストを用意する必要があります。

考えられるすべての文字列を含むテーブル( "lovdata")と、フィールドが他のテーブルの文字列と同じである行を削除するクエリを実行することをお勧めします。

このように使用できるかどうかについて誰でも正しい方向に向けることができますか?

多くのおかげで、 キャップ

答えて

7

あなたはLIKE演算子で参加することができますを確認します。lovdata.pointid列は、ワイルドカードを含んで検討することができる

DELETE FROM lovalarm a 
WHERE EXISTS (SELECT NULL 
       FROM lovdata d 
       WHERE a.pointid LIKE d.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 
+0

と例です。あなたは私にそれを打つ!私はちょうど彼がLIKEを使いたがっていることに気が付いたので、私はちょうどその答えを変えようとしていました。 – BG100

+0

'd.pointid'に実際にワイルドカードが含まれていない限り、この' LIKE'は基本的に等価性テストです。あなたは 'a.pointid LIKE d.pointid || '%''のようなものが必要かもしれません。 –

+0

@Dave:ワイルドカードを使用しないと、LIKEは同等のテストとして扱われます(効率的なアクセスパスの使用を妨げる可能性もあります)。私は小さな例を追加するつもりだった。 –

2

はちょうどこのように、サブクエリを使用します。

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

EDIT:は同じようにはINはこのように動作するつもりはないので、必要とされていることに気づきました完全一致となります。ここでは、Vincentがすでに正しいクエリを追加しているので、ここでは参照用にしておきます。

1

は%の連結

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