选择C1值,其中第0行(C2)的值在C3中,而所有其他行的值为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列中(。选择具有第一行的列1的数据的查询是什么,即列2中的0在C3中具有值(不是null(,并且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。我们需要选择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应该是数字吗?我是这样处理的,但在您的样本数据中,您将其作为字符串给出。

最新更新