简体   繁体   English

使用DISTINCT和INNER JOIN的SQL

[英]SQL using DISTINCT with INNER JOIN

I currently have 9 columns joined using INNER JOIN but i now want to remove the duplicates from column 1 which is CIFnumber . 我目前有9列使用INNER JOIN但现在我想从列1中删除重复项,即CIFnumber

If i use DISTINCT at the top of the query it does not function. 如果我在查询顶部使用DISTINCT ,它将无法正常运行。

What could I do? 我能做什么?

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
    )

DISTINCT does function - it remove duplicates of the column set in specific SELECT statement. DISTINCT确实起作用-它删除特定SELECT语句中列集的重复项。 If DISTINCT did't remove duplicates for specific column in your column set it means that you have unique values in other columns. 如果DISTINCT没有删除列集中特定列的重复项,则意味着在其他列中具有唯一值。

If you need only one unique value from specific column and don't care about other column values, you can use window function. 如果您只需要特定列中的一个唯一值并且不关心其他列值,则可以使用窗口函数。

   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

You have two or more different values in at least one of your columns. 至少一列中有两个或多个不同的值。 If you dont care about some data you can use TOP 1 WITH TIES + ROW_NUMBER : 如果您不关心某些数据,则可以使用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))

In my example I expect that c.CIFNumber, c.FirstName, c.Surname, c.FamilyID are unique. 在我的示例中,我希望c.CIFNumber, c.FirstName, c.Surname, c.FamilyID是唯一的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM