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
应该是数字吗?我是这样处理的,但在您的样本数据中,您将其作为字符串给出。