2016-11-16 12 views
1

我使用Informix數據庫,在這裏我有2個表artind座標個具有彼此關係,key_codecm_key_coord_codeSQL:從另一個表中只存在一個特定ID的表中選擇行的最佳方法是什麼?

artind

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

coord

+--------------------+-------------+ 
| Field    | Type  | 
+--------------------+-------------+ 
| cm_key_coord_code | char(8)  | 
| cm_t_coor   | int   | 
| descr_coord  | char(30) | 
+--------------------+-------------+ 

通常選擇在表artind所有記錄中沒有與 相同的代碼(key_code等於cm_key_coord_code)和cm_t_coor = 2的記錄在 表座標我用:

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

有一個更好辦法?

回答

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_key_coord_code多個記錄,但不同cm_t_coor。如何選擇只有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 

,如果你有你我建議在表上