2016-11-16 10 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 

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