我使用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 +
+-------------------+-----------+-------------+
答案 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 by
和having
:
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;
您可以通过两种方式之一获取原始行。一种方法是将结果加在一起或(等效地)使用in
或exists
:
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)