2016-11-16 3 views
0

Я использую базу данных Informix, где у меня есть таблица коорд:Sql: Как я могу выбрать только одну запись, которая, не настоящий идентификатор

+--------------------+-------------+ 
| 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_key_coord_code, который имеет только строки с cm_t_coor! = 2?

Я хочу, чтобы выбрать только следующие значения:

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

 Смежные вопросы

  • Нет связанных вопросов^_^