Select 第 0 行 (C2) 的 C1 值在 C3 和所有其他行 (C2) 中的值为 NULL - Oracle

Select the C1 values having 0th line(C2) has value in C3 and all other lines(C2) having value as NULL - Oracle

 CREATE TABLE TABLE1
 (
   C1 VARCHAR2(3), C2 VARCHAR2(3), C3 VARCHAR2(4)
 );

INSERT INTO TABLE1 VALUES('A', '0', '1234');
INSERT INTO TABLE1 VALUES('A', '1', '4568');
INSERT INTO TABLE1 VALUES('A', '2', '5432');
INSERT INTO TABLE1 VALUES('B', '0', '3562');
INSERT INTO TABLE1 VALUES('B', '1', Null);
INSERT INTO TABLE1 VALUES('B', '2', Null);
INSERT INTO TABLE1 VALUES('C', '0', '2132');
INSERT INTO TABLE1 VALUES('C', '1', Null);
INSERT INTO TABLE1 VALUES('C', '2', '5431');

当您执行上述查询时,我们将数据放入 TABLE1 中,并且 C1 列的每个唯一值对应于 3 行,即 0、1、2(在 C2 列中)。 select column1 的数据有第一行的查询是什么,即 column2 中的 0 在 C3 中有一个值(不为空),而 C2 的所有其他行在 C3 中的值为 Null。

以上例子的答案是

 C1    C2      C3
------------------
 B     0       3562
 B     1       Null
 B     2       Null

有各种各样的行。对于 C1 的每个唯一值都可以有多行,即 C2 中的 0 到 100 等,但我以上面的一个为例。在上面你可以看到 A 在所有 3 行中都有值。 B 在第 0 行中有值,但在所有其他行中为 Null。 C 在第 0 行和第 2 行有值,但在第 1 行有 Null。我们需要 select C1 的唯一值在第 0 行具有值,在其他行具有 Null

也许是这样的:

select *
from   table1
where  c1 in (
               select c1
               from   table1
               group  by c1
               having count(case when c2 = 0 then c3 end) = 1
                  and count(c3)                           = 1
             )
order  by c1, c2
;



C1  C2  C3  
--- --- ----
B   0   3562
B   1       
B   2      

这会读取基础数据两次。如果改为使用分析函数,则可以只读取一次基础数据,但分析函数本身比传统聚合要慢。如果此查询对您有效,但速度很慢,您可以尝试使用分析函数方法来确定,但我希望它会更慢,而不是更快。

c2 列应该是数字吗?我这样对待它,但在您的示例数据中,您将其作为字符串提供。