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
列应该是数字吗?我这样对待它,但在您的示例数据中,您将其作为字符串提供。
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
列应该是数字吗?我这样对待它,但在您的示例数据中,您将其作为字符串提供。