【问题标题】:How to display the duplicates from a table?如何显示表格中的重复项?
【发布时间】:2015-01-19 20:29:07
【问题描述】:

我有问题。我尝试显示表中的重复项。我在 pl sql 中的代码

SELECT intermediary_nr, beneficiary_role, contract_nr
  FROM (SELECT *
          from (select intermediary_nr,
                       beneficiary_role,
                       max(contract_nr) contract_nr
                  from boscs.atcs_commission_beneficiary
                 where beneficiary_role = 'LEAD'
                   and intermediary_nr is not null
                 group by intermediary_nr, beneficiary_role
                 ORDER BY dbms_random.value)

        union all
        SELECT *
          from (select intermediary_nr,
                       beneficiary_role,
                       max(contract_nr) contract_nr
                  from boscs.atcs_commission_beneficiary
                 where beneficiary_role = 'SUP_FOR_LEAD'
                   and intermediary_nr is not null
                 group by intermediary_nr, beneficiary_role
                 ORDER BY dbms_random.value)

        union all
        SELECT *
          from (select intermediary_nr,
                       beneficiary_role,
                       max(contract_nr) contract_nr
                  from boscs.atcs_commission_beneficiary
                 where beneficiary_role = 'COAGENT'
                   and intermediary_nr is not null
                 group by intermediary_nr, beneficiary_role
                 ORDER BY dbms_random.value))

选择 intermediary_nr、beneficiary_role、contract_nt if a.contract_nr = b.contract_nr = c.contract_nr

这个关系我很感兴趣。我请关于如何解决这个问题的提示。有什么想法吗?我只想显示与 a、b、c 相同的 contract_nr 信息。其余的没有。有谁知道如何完成这些问题?

【问题讨论】:

  • 我没有看到问题。我不太了解您要完成的工作。我不确定您发布的代码是否引发错误,是否无法产生您想要的结果,或者其他什么。我无法理解为什么你会在这种查询中order by dbms_random.value。发布一个可重现的测试用例以及所需的结果将是一个很好的帮助。
  • 我的代码会抛出与子查询匹配的所有 3 个结果。我只想显示符合上述关系的重复项 contract_nr 第一个子查询 = contract_nr of 2 subquery = contract_nr of 3 个子查询
  • 抱歉,我不确定在这种情况下“仅重复”是什么意思。也许您希望使用intersect 而不是union all,但这只是我在黑暗中摸索。一个可重现的测试用例可能会很有帮助。
  • ![在此处输入图像描述][1] [1]:i.stack.imgur.com/TzKbF.png 如果 a.contract_nr = b.contract_nr = c.contract_nr 这个关系我感兴趣,请选择 intermediary_nr、beneficiary_role、contract_nt。我请关于如何解决这个问题的提示。
  • 如果您想发布更多信息,请编辑您的问题。

标签: sql database plsql oracle-sqldeveloper plsqldeveloper


【解决方案1】:

如果我理解该请求,您只想查看在所有三个结果集中具有相同协定的那些行。如果是这样,没问题。

首先,让我们稍微收紧查询。您有七个(!)SELECT 语句,其中只需要一个。

select  intermediary_nr, beneficiary_role, max(contract_nr) contract_nr
from    boscs.atcs_commission_beneficiary
where   beneficiary_role in( 'LEAD', 'SUP_FOR_LEAD', 'COAGENT' )
    and intermediary_nr is not null
group by intermediary_nr, beneficiary_role;

我省略了order by 子句,因为它似乎没有任何用途。

这将生成一个类似这样的结果集:

intermediary_nr  beneficiary_role  contract_nr
===============  ================  ===========
            ...  ...               ...
             10  LEAD              100
             10  SUP_FOR_LEAD      100
             20  LEAD              101
             20  SUP_FOR_LEAD      101
             20  COAGENT           101
            ...  ...               ...

对于剩下的部分,我假设如下输出是不可能的:

intermediary_nr  beneficiary_role  contract_nr
===============  ================  ===========
            ...  ...               ...
             10  LEAD              100
             10  SUP_FOR_LEAD      100
             20  LEAD              101
             20  SUP_FOR_LEAD      101
             20  COAGENT           101
             30  COAGENT           101
            ...  ...               ...

我不知道您的数据是什么样的,所以我不知道这是否是一个有效的假设。只有你能回答。

现在您只需要所有三个角色都出现相同合同编号的行。在我的示例中,这将是 101。如果我们将第一个查询的结果提供给第二个查询,我们可以对该结果执行更多分组:

select   contract_nr
from     <query above>
group by contract_nr
having count(*) = 3;

这将为您提供您正在寻找的合同的清单。将它们联合回第一个查询,你就会得到你(我希望)正在寻找的结果:

with
ContractByRole( intermediary_nr,  beneficiary_role,  contract_nr )as(
  select  intermediary_nr, beneficiary_role, max(contract_nr) contract_nr
  from    boscs.atcs_commission_beneficiary
  where   beneficiary_role in( 'LEAD', 'SUP_FOR_LEAD', 'COAGENT' )
      and intermediary_nr is not null
  group by intermediary_nr, beneficiary_role
),
AllRoles( contract_nr )as(
  select   contract_nr
  from     ContractByRole
  group by contract_nr
  having count(*) = 3
)
select  cbr.*
from    ContractByRole cbr
join    AllRoles       ar
    on  ar.contract_nr = cbr.contract_nr;

生成:

intermediary_nr  beneficiary_role  contract_nr
===============  ================  ===========
             20  LEAD              101
             20  SUP_FOR_LEAD      101
             20  COAGENT           101

如果中间值不符合我展示的模式,则必须稍微调整查询以进行补偿,但这并不难。

【讨论】:

  • 我有你的代码,我有声明:不支持的列别名
猜你喜欢
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
  • 1970-01-01
  • 2015-11-21
  • 2018-06-13
  • 1970-01-01
相关资源
最近更新 更多