如何从表中返回特定值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从表中返回特定值相关的知识,希望对你有一定的参考价值。

我需要从表中返回行,其中ID的所有行都具有CODE的某个特定值。

例如:

TABLE: A

ID   | NAME  |CODE
-----------------
101  | XXX   | A
101  | XXX   | B
101  | XXX   | C
101  | XXX   | A
102  | XXX   | B
103  | XXX   | B
104  | XXX   | D
104  | XXX   | B
105  | XXX   | A
105  | XXX   | B
105  | XXX   | D
105  | XXX   | A
106  | XXX   | B
107  | XXX   | B

我需要只有代码B的行。所以这是上表的预期输出:

ID   | NAME  |CODE
-----------------
102  | XXX   | B
103  | XXX   | B
106  | XXX   | B
107  | XXX   | B

这里ID 101,104,105也有代码B,但它们不应该在我的输出中返回,因为它们还有其他代码。

我可以写什么查询来获得输出?

我还需要确保这些值在另一个表B中不存在。所以,我需要添加

AND NOT EXISTS (SELECT 1 FROM TABLE B WHERE B.ID = A.ID)

B表有主键ID,B表中没有Code列。我只是使用这个表来消除公共ID,因为我需要表A中存在的结果,而不是表B.

这是示例数据

Table : B 

ID  | Name  | City  | Department
------------------------------
101  | XXX   | XXX  | XX
104  | XXX   | XXX  | XX
105  | XXX   | XXX  | XX
107  | XXX   | XXX  | XX

在表A中,107 IDCode列中仅具有B.但是,它存在于表B中,因此我不想在输出中返回此行。

答案

这是一种方法:

select b.id
from tableb b
group by b.id
having min(b.code) = max(b.code) and min(b.code) = 'B';

如果你特别指的是没有“A”和“B”,但允许其他代码,那么你可以这样做:

select b.id
from tableb b
where b.code in ('A', 'B')
group by b.id
having min(b.code) = max(b.code) and min(b.code) = 'B';
另一答案

还有一个选择:

select id
from tableb
group by id
having sum(decode(code, 'B', 0, 1)) = 0

[问题被修改后编辑]

select *
from tablea a
where a.id in (select a1.id
               from tablea a1
               group by a1.id
               having sum(decode(a1.code, 'b', 0, 1)) = 0
              )              
  and not exists (select null from tableb b where b.id = a.id) 
另一答案

每当您需要像count这样的分组功能时,您希望保留所有细节,请使用分析功能。甲骨文说:

它们与聚合函数的不同之处在于它们为每个组返回多行。

这样你就可以避免两次击中表格。还要小心正确处理nulls

select id, name 
  from (select id, name, code, 
               count(case when code <> 'B' or code is null then 1 end) 
                     over (partition by id) cnt
          from a) a
  where cnt = 0 and not exists (select 1 from b where id = a.id)

SQL demo

另一答案

这是使用NOT EXISTS的解决方案:

SELECT
    ID
    ,NAME
    ,CODE
FROM tblA a
WHERE CODE = 'B'
AND NOT EXISTS (
    SELECT ID
    FROM tblA b
    WHERE CODE <> 'B'
    AND a.ID = b.ID
)
AND NOT EXISTS (
    SELECT ID
    FROM tblB c
    WHERE a.ID = c.ID 
)

以上是关于如何从表中返回特定值的主要内容,如果未能解决你的问题,请参考以下文章

从表中选择数据并从另一个表中填充特定值

从表中删除记录,如果其特定值未出现在另一个表中

从表中选择行,其中具有相同 id 的另一个表中的行在另一列中具有特定值

SQL 函数,通过使用参数从表中返回值

如何使用 C# 从表中的二维数组输出值

从表中返回加起来达到最大给定值的项目