2017-10-19 205 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是唯一的。