没有使用Oracle Analytical功能的任何其他选项

时间:2015-09-07 12:10:58

标签: sql oracle window-functions

有人可以帮我解决这个问题吗?

CREATE TABLE TT (
     A NUMBER PRIMARY KEY,
     B VARCHAR2(5)
);

insert into tt values (11,'A'); 
insert into tt values (12,'A'); 
insert into tt values (13,'B'); 
insert into tt values (14,'B'); 
insert into tt values (15,'C'); 
insert into tt values (16,'D'); 
insert into tt values (17,'E'); 
insert into tt values (18,'E'); 
insert into tt values (19,'F'); 
insert into tt values (20,'F'); 

COMMIT;

SELECT * FROM TT; 

+---+---+
| A | B |
+---+---+
|11 | A |
|12 | A |
|13 | B |
|14 | B |
|15 | C |
|16 | D |
|17 | E |
|18 | E |
|19 | F |
|20 | F |
+---+---+

我的要求是'B'列映射了多个'A'列的内容Like(值'E'映射了'A'列中的两行) o / p

+---+
| A |
+---+
| 11| 
| 12| 
| 13| 
| 14| 
| 17| 
| 18| 
| 19| 
| 20| 
+---+

我已经实现了使用以下分析查询。我想知道是否可以在没有分析功能的情况下进行存档。

select a
from (SELECT tt.*, COUNT(*) over (partition by b) cnt
      FROM TT
     )
where cnt >= 2;

3 个答案:

答案 0 :(得分:1)

使用聚合这很容易:

select a
from tt 
where b in (select b from tt group by b having count(*) > 1);

注意,您可以避免使用聚合,因为Oracle提供了rowid伪列:

select a
from tt
where exists (select 1
              from tt tt2
              where tt2.b = tt.b and tt2.rowid <> tt.rowid
             );

答案 1 :(得分:0)

您可以通过以下方式找到候选人:

select a 
from tt
where B in (
            select B
            from tt
            group by b
            having count(*) >= 2);

答案 2 :(得分:0)

.quick-actions i {
    font-size: 54px;
    cursor: pointer;
    color: #999;
    vertical-align: middle;
}
.fa:before {
    vertical-align: middle;
}
.quick-actions{
    border:1px solid #ccc;
    display: inline-block;
}

这是另一种解决方案。我认为在这种情况下你无法避免使用聚合函数。