Sql:如何只选择一个不存在id的记录

时间:2016-11-16 19:24:03

标签: sql select informix

我使用Informix数据库,我有一个表 coord

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

包含如下所示的数据:

+-cm_key_coord_code-+-cm_t_coor-+-descr_coord-+
+ 00000001          +    1      + coord01a    +
+ 00000001          +    2      + coord01b    +
+ 00000002          +    1      + coord02a    +
+ 00000002          +    2      + coord02b    +
+ 00000003          +    1      + coord03a    +
+ 00000004          +    2      + coord04a    +
+ 00000005          +    1      + coord05a    +
+-------------------+-----------+-------------+

该表具有多个记录,具有相同的cm_key_coord_code,但不同的cm_t_coor。如何选择仅包含cm_t_coor行的cm_key_coord_code!= 2?

我想只选择以下值:

+-cm_key_coord_code-+-cm_t_coor-+-descr_coord-+
+ 00000003          +    1      + coord03a    +
+ 00000005          +    1      + coord05a    +
+-------------------+-----------+-------------+

3 个答案:

答案 0 :(得分:1)

SELECT t1.*
  FROM Table t1,
       ( SELECT cm_key_coord_code
           FROM Table
         GROUP BY cm_key_coord_code   
         HAVING COUNT(*) = 1      
        ) t2
 WHERE t1.cm_key_coord_code = t2.cm_key_coord_code
   AND t1.cm_t_coor <> 2;

答案 1 :(得分:1)

我会使用group byhaving

来解决这个问题
select c.cm_key_coord_code
from coord c
group by c.cm_key_coord_code
having sum(case when c.cm_t_coor = 2 then 1 else 0 end) = 0;

您可以通过两种方式之一获取原始行。一种方法是将结果加在一起或(等效地)使用inexists

select c.*
from coord c
where c.cm_key_coord_code in (select c.cm_key_coord_code
                              from coord c
                              group by c.cm_key_coord_code
                              having sum(case when c.cm_t_coor = 2 then 1 else 0 end) = 0
                             );

或者,如果您知道始终只有一行,则可以使用聚合函数:

select c.cm_key_coord_code, min(cm_t_coor), min(descr_coord)
from coord c
group by c.cm_key_coord_code
having sum(case when c.cm_t_coor = 2 then 1 else 0 end) = 0

答案 2 :(得分:1)

您也可以使用NOT EXISTS子句执行此操作。尝试:

SELECT c.cm_key_coord_code
FROM coord c
WHERE NOT EXISTS
(SELECT 1
 FROM coord c2
 WHERE c2.cm_key_coord_code = c.cm_key_coord_code
 AND c2.cm_t_coor = 2)