2017-10-19 487 views
1

我现在有9列加入了使用INNER JOIN ,但我现在想从作为CIFnumber塔1移除重复。SQL使用DISTINCT与INNER JOIN

如果我在查询顶部使用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 
    ) 
+2

为什么不只是发布您的脚本?没有人想用手写出来回答你的问题 –

+0

我很抱歉,现在我将添加它 – user8801052

+0

选择不同的c.CIFNumber,c.FirstName,c.Surname,c.FamilyID,a.AccountID,b .ValuationAmount,d.NAME,ad.ID_Number,f.PrPlanner 从CUSTOMERINFORMATIONFILETBLç 内部联接ACCOUNTTBL一个上c.CIFNumber = a.CIFNumber 内部联接BALANCETBL b关于a.AccountID = b.AccountID 内部联接FAMILYTBL上c.FamilyID F = f.FamilyID 内部联接DIVISION d上f.DIVISION = d.ID 内上c.CIFNumber = ad.CIF 其中 b.ValuationDate =“2017年9月30日加入ADDRESSTBL广告' and d.name ='Wealth Management' and(ad.ID_Number =''or ad.ID_Number is null or LEN(ad.ID_Number)<13) – user8801052

回答

0

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 
0

在至少一列中有两个或更多不同的值。如果你没有的一些数据护理可以使用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是唯一的。