如何删除查询中的重复项?

时间:2019-07-19 11:14:21

标签: sql sql-server tsql

我正在尝试删除重复项,因为我想在“ EnterpriseId”列中仅显示一个名称,并且该名称中的值最高(在这种情况下为1300)。因此,基本上,如果我对globalofferingleadnm和managernm具有相同的名称,那么我只想为globalofferingleadnm删除Managernm获得一个值。

这是用于SQL

-- Set Variables
Declare @M1 as INT
Declare @M2 as INT

Set @M1 = '1300'
Set @M2 = '949'

Select
a.globalofferingleadnm as 'EnterpriseID',
Case
When a.GlobalOfferingLeadNm = a.GlobalOfferingLeadNm then  @M1 end as 'FlairID'

from Offering_vw a

where a.OfferingClassNm <> 'Asset Group'
GROUP BY
a.GlobalOfferingLeadNm

UNION

select
a.ManagerNm as 'EnterpriseID',
Case
When a.ManagerNm = a.ManagerNm then @M2 end as 'FlairID'

from Offering_vw a
where a.ManagerNm <> a.GlobalOfferingLeadNm AND a.OfferingClassNm <> 'Asset Group'
Group By
a.ManagerNm

如果名称由globalofferingleadnm和managernm重复,我只想获取globalofferingleadnm并删除managernm。

2 个答案:

答案 0 :(得分:0)

看来您真的是想对两个查询进行联接,而不是UNION。您只希望每个EnterpriseID仅显示一行吗?

也许会有更优雅的解决方案将两个查询组合在一起,但是您始终可以将它们分开,并执行某种形式的联接以获取结果。

在这种情况下,我尝试了完全外部联接,因为似乎两个查询中的任何一个都可能有一行。

(注意:如果没有DDL和SQL Server数据库,我将无法测试)

with q1 as(
  Select
  a.globalofferingleadnm as 'EnterpriseID',
  Case
  When a.GlobalOfferingLeadNm = a.GlobalOfferingLeadNm then  @M1 end as 'FlairID'

  from Offering_vw a

  where a.OfferingClassNm <> 'Asset Group'
  GROUP BY
  a.GlobalOfferingLeadNm
),
q2 as(
  select
  a.ManagerNm as 'EnterpriseID',
  Case
  When a.ManagerNm = a.ManagerNm then @M2 end as 'FlairID'

  from Offering_vw a
  where a.ManagerNm <> a.GlobalOfferingLeadNm AND a.OfferingClassNm <> 'Asset Group'
  Group By
  a.ManagerNm
)
select coalesce(q1.EnterpriseID, q2.EnterpriseID) as 'EnterpriseID',
       case when q1.EnterpriseID is not null then q1.'FlairID' else q2.'FlairID' end as 'FlairID'
  from q1 full outer join q2 on q1.'EnterpriseID' = q2.'EnterpriseID';

此方法使用WITH子句,为方便起见,更容易将两个查询视为表,将其视为q1和q2。

然后,将q1和q2通过完全外部联接进行联接-无论它来自哪个来源,都会有一行。

之所以需要coalesce,是因为两个EnterpriseID键之一可能由于完全外部联接而为null。

最后,在case语句中返回了FlairID的首选源。

答案 1 :(得分:0)

我相信在这种情况下,您需要导出临时表,然后在不存在初始结果的情况下将它们合并,因为globalofferingleadnm优先。另外,不确定是否需要这些case语句。

-- Set Variables
Declare @M1 as INT
Declare @M2 as INT

Set @M1 = '1300'
Set @M2 = '949'

Select
    a.globalofferingleadnm as 'EnterpriseID',
    @M1 'FlairID'

into
    #temp 1

from
    Offering_vw a

where
    a.OfferingClassNm <> 'Asset Group'

GROUP BY
    a.GlobalOfferingLeadNm
;

select
    a.ManagerNm as 'EnterpriseID',
    @M2 'FlairID'

into
    #temp2

from
    Offering_vw a

where
    a.ManagerNm <> a.GlobalOfferingLeadNm AND a.OfferingClassNm <> 'Asset Group'

Group By
    a.ManagerNm
;

insert into
    #temp1

select
    EnterpriseID
    ,FlairID

from
    #temp2 A

where
    exists
        (select 1

        from
            #temp1 B

        where
            A.EnterpriseID <> B.EnterpriseID)
;

select *

from
    #temp1
;