2016-11-16 5 views
1

私は2つのテーブルartindCOORD互いに関係を有するkey_codecm_key_coord_codeを有するInformixデータベースを使用SQL:特定のIDのみを持つ別のテーブルに存在しないテーブルから行を選択する最適な方法は何ですか?

テーブルartind

+-----------+-------------+ 
| Field  | Type  | 
+-----------+-------------+ 
| key_code | char(8)  | 
| descr  | char(30) | 
+-----------+-------------+ 

テーブル同義語

select * from artind where 
key_code not in (select cm_key_coord_code from coord 
where cm_t_coor = 2); 

良くあり:通常

+--------------------+-------------+ 
| Field    | Type  | 
+--------------------+-------------+ 
| cm_key_coord_code | char(8)  | 
| cm_t_coor   | int   | 
| descr_coord  | char(30) | 
+--------------------+-------------+ 
は、私が使用 テーブルCOORDに 同じコード(cm_key_coord_codeに等しいkey_code)とcm_t_coor = 2でレコードを持っていないテーブルartind内のすべてのレコードを選択します方法?

答えて

3

あなたの方法は問題ありませんが、お勧めしません。 cm_key_coord_codeの値がNULLの場合、レコードは選択されません。つまり、NOT INが定義されていますが、通常は意図されていません。

私はNOT EXISTSLEFT JOINいずれかを助言する:

select a.* 
from artind a 
where not exists (select 1 
        from coord c 
        where c.cm_t_coor = 2 and c.cm_key_coord_code = a.key_code 
       ); 

か:

select a.* 
from artind a left join 
    coord c 
    on c.cm_t_coor = 2 and c.cm_key_coord_code = a.key_code 
where c.cm_key_coord_code is null; 
+0

上のインデックスを見てお勧めあなたのパフォーマンスに問題がある場合。 cm_t_coor!= 2の行のみを持つcm_key_coord_codeを選択するにはどうすればよいですか? – famedoro

+0

@famedoro。 。 。それはあなたが尋ねた質問と微妙に異なります。私はあなたがサンプルデータと望ましい結果で別の質問をすることをお勧めします。 –

+0

http://stackoverflow.com/questions/40640610/sql-how-can-i-select-only-one-record-which-non-present-an-idをご覧ください – famedoro

1

私はあなたより良い方法があるとは思いません。私はあなたに別のものを与えることができますが、最終的にこれはクエリエンジンから同じ操作に変換される可能性があります。あなたが実際にクエリを実行する可能性があります。

select artind.* from artind 
    left join coord on key_code = cm_key_coord_code and cm_t_coor = 2 
where cm_key_coord_code is null 

あなたは私は同じcm_key_coord_code持つ複数のレコードが、異なるcm_t_coorを持つテーブルCOORDでテーブル

関連する問題