【问题标题】:Sql: How can I select only one record which non present an idSql:如何只选择一个不存在 id 的记录
【发布时间】:2016-11-16 19:24:03
【问题描述】:

我使用 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 != 2 行的 cm_key_coord_code?​​p>

我只想选择以下值:

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

【问题讨论】:

  • 使用排名函数可能是一种解决方案
  • @Vijey 你能举个例子吗?
  • 如果有两行具有某个 cm_key_coord_code 但其中一个 cm_t_coor = 1 和另一个 cm_t_coor = 3 怎么办?应该返回一行还是两行或都不返回?
  • @kbball cm_t_coor = 1 和 cm_t_coor = 3 的两行都应该返回。

标签: sql select informix


【解决方案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;

【讨论】:

  • 如果有两行具有某个 cm_key_coord_code 但其中一个 cm_t_coor = 1 和另一个 cm_t_coor = 3 怎么办?那么你的答案不会返回那些行,但我认为它们应该被返回
【解决方案2】:

我会使用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

【讨论】:

  • @Teja 您可能应该添加更多关于您认为错误的信息。
【解决方案3】:

您也可以使用 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 2011-02-17
    相关资源
    最近更新 更多