2016-11-16 13 views
0

我使用Informix數據庫,在這裏我有一個表座標只有一個記錄:SQL:如何選擇其非本一個id

+--------------------+-------------+ 
| 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!= 2的行的cm_key_coord_code?

我只想選擇以下值:

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

使用排名功能可能是一個解決方案 – VDK

+0

@Vijey你能舉個例子嗎? – famedoro

+0

如果有兩行含有某個cm_key_coord_code,但是對於一個cm_t_coor = 1和另一個cm_t_coor = 3,該怎麼辦?是否應該返回一個或兩個或兩個行? – kbball

回答

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

如果有兩行含有某個cm_key_coord_code,但是對於一個cm_t_coor = 1,對於另一個cm_t_coor = 3,該怎麼辦?那麼你的答案不會返回這些行,但我認爲他們應該返回 – kbball

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 
+0

你的回答是不正確的... – Teja

+3

@Teja你可能應該添加更多關於你認爲是錯誤的信息。 –

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)