2017-03-02 5 views
0

私は3つのテーブル空港、位置と場所のヒントを持っています。ロケーションテーブルを更新した後、空港の名前を削除する必要があります。空港名は、場所のn_airports列には存在しません.n_airpots列は、昏睡状態の空港コードの集合です。私はLik%code%で選択して一つずつ削除しようとしましたが、それは有用ではありません。
これなステートメントはすべて他のテーブルにコードが存在しない行を削除する

DELETE 
FROM location_hint 
WHERE type = 2 AND name NOT IN 
(
    SELECT a.name 
    FROM airports a 
    WHERE a.code IN 
    (
     SELECT n_airports 
     FROM location 

     ) 
) 

空港テーブル

CREATE TABLE airports (
    _id INTEGER, 
    code TEXT, 
    name TEXT, 
    PRIMARY KEY(_id) 
) 

enter image description here ロケーションテーブル

CREATE TABLE `location` (
    `_id` integer, 
    `country` text, 
    `city` text, 
    `n_airports` text, 
    PRIMARY KEY(_id) 
) 

enter image description here 場所のヒントテーブル

を削除しているようです3210テストされていない
CREATE TABLE "location_hint" (
    `_id` INTEGER PRIMARY KEY AUTOINCREMENT, 
    `name` TEXT NOT NULL, 
    `type` INTEGER NOT NULL, 
    `country` TEXT, 
    `city` TEXT 
) 

enter image description here

+1

でテストしてください、あなたのデータモデルを改造concideredことがありますか?関連するレコードをカンマで区切った値をテキストフィールドに入れることは、リレーショナルデータベースを持つという目的に反する。 – Morten

+0

@Morten unfortunatlyプロジェクトの遺産部分であり、あまりにも多くはそれに縛られている – Yarh

答えて

2

は、メモ帳にすばやく走り書き - しかし

DELETE 
FROM location_hint 
WHERE type = 2 AND name IN 
(
    SELECT a.name 
    FROM airports 
    MINUS 
    SELECT a.name 
    FROM airports a 
    WHERE EXISTS(
     SELECT 1 
     FROM location 
     WHERE INSTR(','||n_airports||',' , ','||a.code||',') > 0 
     ) 
) 
+0

そのコードはフリーズする( – Yarh

+0

また、なぜあなたが '、' || n_airports || '、concateneteなぜ?KLAX、JNY、 PTTなど – Yarh

+0

フリーズはIN'はデータを削除する非常にチューニングされた方法ではありませんが、NOT '使用する。なぜなら最も外側のクエリである可能性があります。空港の場所から1 を選択 (EXISTS FROM a.name をSELECT' をテスト WHERE INSTR( '、' || n_airports || '、'、 '、' || a.code || '、')> 0 ) ' 最初に –

関連する問題