Oracle SQL从某些列中删除重复的结果

时间:2019-03-30 13:11:47

标签: sql oracle

我的数据在单独的表中具有类别和子类别。当我写一个查询来加入他们时,我得到下表,其中类别行重复:

|  Col1 |    Col2   |   Col3     | Col 4 | 
|-------|-----------|------------|-------|
|  Cat1 | Cat1 Data | Subcat 1.1 | Etc   |
|-------|-----------|------------|-------|
|  Cat1 | Cat1 Data | Subcat 1.2 | Etc   |
|-------|-----------|------------|-------|
|  Cat1 | Cat1 Data | Subcat 1.3 | Etc   |
|-------|-----------|------------|-------|
|  Cat2 | Cat2 Data | Subcat 2.1 | Etc   |
|-------|-----------|------------|-------|
|  Cat2 | Cat2 Data | Subcat 2.2 | Etc   |
|-------|-----------|------------|-------|
|  Cat2 | Cat2 Data | Subcat 2.3 | Etc   |
|-------|-----------|------------|-------|

有什么办法可以打印出来,而主要类别只显示一次?

|  Col1 |    Col2   |   Col3     | Col 4 | 
|-------|-----------|------------|-------|
|  Cat1 | Cat1 Data | Subcat 1.1 | Etc   |
|-------|-----------|------------|-------|
|       |           | Subcat 1.2 | Etc   |
|-------|-----------|------------|-------|
|       |           | Subcat 1.3 | Etc   |
|-------|-----------|------------|-------|
|  Cat2 | Cat2 Data | Subcat 2.1 | Etc   |
|-------|-----------|------------|-------|
|       |           | Subcat 2.2 | Etc   |
|-------|-----------|------------|-------|
|       |           | Subcat 2.3 | Etc   |
|-------|-----------|------------|-------|

在线搜索仅返回使用distinct或groupby的引用,这些引用似乎并不适合用例。我知道这里的答案通常是“使用前端工具”,但这对我而言并不是真正的选择。

2 个答案:

答案 0 :(得分:1)

您好,这确实可以满足您的要求

数据(DDL)

create table example(
   col1 varchar(100),
   col2 varchar(100),
   col3 varchar(100),
   col4 varchar(100)
);

insert into example(col1,col2,col3,col4) values('Cat1','Cat1 Data', 'Subcat 1.1', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat1','Cat1 Data', 'Subcat 1.2', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat1','Cat1 Data', 'Subcat 1.3', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat2','Cat2 Data', 'Subcat 2.3', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat2','Cat2 Data', 'Subcat 2.3', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat2','Cat2 Data', 'Subcat 2.3', 'Etc');

SQL查询(答案)

select
   CASE WHEN lag(col1) over (partition by null order by col1) = col1 THEN null ELSE col1 END col1,
   CASE WHEN lag(col2) over (partition by null order by col2) = col2 THEN null ELSE col2 END col2,
   col3, col4
From example

答案 1 :(得分:1)

重复比较好。但是,您可以使用row_number()

select (case when row_number() over (partition by col1, col2 order by ?) = 1
             then col1
        end) as col1
       (case when row_number() over (partition by col1, col2 order by ?) = 1
             then col2
        end) as col2,
       . . .
from t
order by col1, col2, ?;

请注意,?用于指定顺序的列-定义每一行的“第一”。

在外部查询中包括order by非常重要。 SQL结果集(如表)是无序。如果没有order by,则可以按任何顺序返回行,但是在这种情况下,顺序很重要。