首页 > 解决方案 > 抑制Oracle sql中的重复值

问题描述

我正在使用 Oracle BIPublisher 构建一个 sql 查询。现在我的查询输出是:

ControlID  Role
1          ABC
1          SJD
1          DKF
2          LLL
2          IJK

我如何编写 sql 以使输出像这样输出?

ControlID  Role   
1          ABC
           SJD
           DKF
2          LLL
           IJK

*** 编辑:我能够使用 Tim 的解决方案来压制:

SELECT DISTINCT
    CASE WHEN ROW_NUMBER() OVER (PARTITION BY GRCC_CONTROL_ID  ORDER BY erp_user_name) = 1
         THEN GRCC_CONTROL_ID  ELSE NULL END AS GRCC_CONTROL_ID ,
    ,role
from GRC_CTRL_AAC_INCIDENTS 
ORDER BY GRCC_CONTROL_ID, role

我想用实际的控件名称替换 control_id,但那是在一个单独的表中。当我在上述查询中替换 c.name 时,我收到一条错误消息

未在预期位置找到“FROM”关键字

SELECT DISTINCT
    CASE WHEN ROW_NUMBER() OVER (PARTITION BY c.name  ORDER BY role) = 1
         THEN c.name  ELSE NULL END AS c.name ,
    role
from GRC_CTRL_AAC_INCIDENTS 
,GRC_CTRL_CCM_CONTROL_TL c
where GRCC_CONTROL_ID = c.id
ORDER BY c.name, role

标签: sqloraclebi-publisher

解决方案


这确实是一个表示要求,因此最好在表示层中处理(例如 PHP 或 Java)。话虽如此,我们可以使用以下方法处理此问题ROW_NUMBER

SELECT
    CASE WHEN ROW_NUMBER() OVER (PARTITION BY ControlID ORDER BY Role) = 1
         THEN ControlID ELSE NULL END AS ControlID,
    t.Role
FROM yourTable t
ORDER BY
    t.ControlID,
    t.Role;

在此处输入图像描述

演示

编辑:

您使用的旧样式 pre ANSI-92 连接语法是您实际更新的查询尝试。不要那样做。相反,使用带有别名的显式连接:

SELECT DISTINCT
    CASE WHEN ROW_NUMBER() OVER (PARTITION BY c.name ORDER BY role) = 1
         THEN c.name ELSE NULL END AS name,  -- NOT c.name
    role
FROM GRC_CTRL_AAC_INCIDENTS t
INNER JOIN GRC_CTRL_CCM_CONTROL_TL c
    ON t.GRCC_CONTROL_ID = c.id
ORDER BY
    c.name,
    role;

推荐阅读