【问题标题】:SQL using DISTINCT with INNER JOINSQL 使用 DISTINCT 和 INNER JOIN
【发布时间】:2017-10-19 12:18:53
【问题描述】:

我目前有 9 列使用 INNER JOIN 加入 但我现在想从第 1 列中删除重复项,即 CIFnumber

如果我在查询顶部使用DISTINCT,它将不起作用。

我能做什么?

select distinct
    c.CIFNumber,c.FirstName,c.Surname,c.FamilyID,a.AccountID,
    b.V‌​aluationAmount,d.NAM‌​E,ad.ID_Number,f.PrP‌​lanner 
from
    CUSTOMERINFORMATIONFILETBL c
inner join ACCOUNTTBL a on c.CIFNumber=a.CIFNumber
inner join BALANCETBL b on a.AccountID=b.AccountID
inner join FAMILYTBL f on c.FamilyID= f.FamilyID
inner join DIVISION d on f.DIVISION=d.ID
inner join ADDRESSTBL ad on c.CIFNumber=ad.CIF 
where
    b.ValuationDate = '2017-09-30' and
    d.name = 'Wealth Management' and
    (
        ad.ID_Number= '' or
        ad.ID_Number is null or
        LEN(ad.ID_Number) < 13
    )

【问题讨论】:

  • 为什么不直接发布你的脚本呢?没有人愿意为了回答你的问题而手写出来
  • 我很抱歉,我现在会添加它
  • 从 CUSTOMERINFORMATIONFILETBL c 内部联接中选择不同的 c.CIFNumber,c.FirstName,c.Surname,c.FamilyID,a.AccountID,b.ValuationAmount,d.NAME,ad.ID_Number,f.PrPlanner ACCOUNTTBL a on c.CIFNumber=a.CIFNumber 内连接 BALANCETBL b on a.AccountID=b.AccountID 内连接 FAMILYTBL f on c.FamilyID= f.FamilyID 内连接 DIVISION d 上 f.DIVISION=d.ID 内连接 ADDRESSTBL ad在 c.CIFNumber=ad.CIF 上,其中 b.ValuationDate = '2017-09-30' and d.name = 'Wealth Management' and (ad.ID_Number= '' or ad.ID_Number 为 null 或 LEN(ad.ID_Number)
  • 请使用编辑功能将脚本发布到您的问题中。另请通读:stackoverflow.com/help/mcve 我知道您是新用户,但遵循该链接中指定的规则肯定会让您免于在未来被否决而被遗忘。 编辑,我已经用你上面提供的脚本更新了你的问题。
  • 您想如何删除重复项?有多个 CFINumber 行时应该保留哪一行?

标签: sql sql-server tsql distinct


【解决方案1】:

DISTINCT 确实起作用 - 它删除特定 SELECT 语句中设置的列的重复项。如果 DISTINCT 没有删除列集中特定列的重复项,则意味着您在其他列中具有唯一值。

如果您只需要特定列中的一个唯一值而不关心其他列值,则可以使用窗口函数。

   select *
   from (
    select c.CIFNumber,c.FirstName,..., 
    row_number() over (partition by c.CIFNumber order by [some logic]) as rn
    from...) as a 
    where rn = 1

【讨论】:

    【解决方案2】:

    您的至少一列中有两个或多个不同的值。如果你不关心一些数据你可以使用TOP 1 WITH TIES + ROW_NUMBER:

    select top 1 with ties
                c.CIFNumber,
                c.FirstName,
                c.Surname,
                c.FamilyID,
                a.AccountID,
                b.V‌​aluationAmount,
                d.NAM‌​E,
                ad.ID_Number,
                f.PrP‌​lanner 
    from
        CUSTOMERINFORMATIONFILETBL c
    inner join ACCOUNTTBL a on c.CIFNumber=a.CIFNumber
    inner join BALANCETBL b on a.AccountID=b.AccountID
    inner join FAMILYTBL f on c.FamilyID= f.FamilyID
    inner join DIVISION d on f.DIVISION=d.ID
    inner join ADDRESSTBL ad on c.CIFNumber=ad.CIF 
    where
        b.ValuationDate = '2017-09-30' and
        d.name = 'Wealth Management' and
        (
            ad.ID_Number= '' or
            ad.ID_Number is null or
            LEN(ad.ID_Number) < 13
        )
    ORDER BY ROW_NUMBER() OVER (PARTITION BY c.CIFNumber, c.FirstName, c.Surname, c.FamilyID ORDER BY (SELECT NULL))
    

    在我的示例中,我希望 c.CIFNumber, c.FirstName, c.Surname, c.FamilyID 是唯一的。

    【讨论】:

      猜你喜欢
      • 2012-02-28
      • 2012-01-23
      • 2016-12-23
      • 1970-01-01
      • 2013-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多