2014-12-24 19 views
3

我需要找到所有記錄,FIRSTNAME是重複的,而LASTNAME是重複的,但城市對於名稱重複的記錄是不同的。僞變爲SQL? FirstName和LastName重複但City不同的所有記錄?

所以,我的數據是這樣的:

FirstName LastName CustomerFileLocation   City 
---------------------------------------------------------------------- 
    Joe  Smith   c:\file1\File1.txt   Dallas 
    Joe  Jones   c:\File2\File1.txt   New York 
    Joe  Smith   c:\File3\File1.txt   New Mexico City 
    Harry  Smith   c:\File4\File1.txt   Boca Raton 
    Joe  Smith   c:\File3\File1.txt   Dallas 
    Michael Smith   c:\File1\File1.txt   Dallas 

我想查詢返回

Joe  Smith   c:\file1\File1.txt   Dallas 
    Joe  Smith   c:\File3\File1.txt   New Mexico City 

我寫了下面找到匹配的名字和姓氏。但我不知道怎麼說「與城市不匹配」

SELECT   
    dbo.TblFileCache.FirstName, dbo.TblFileCache.LastName, 
    dbo.TblFileCache.ClaimFilePath, dbo.TblFileCache.Skip 
FROM 
    dbo.TblFileCache 
INNER JOIN 
    (SELECT   
     FirstName, LastName, COUNT(*) AS CountOf 
    FROM 
     dbo.TblFileCache AS tblFileCache_1 
    GROUP BY 
     FirstName, LastName 
    HAVING   
     (COUNT(*) > 1)) AS dt ON dbo.TblFileCache.FirstName = dt.FirstName 
          AND dbo.TblFileCache.LastName = dt.LastName 
WHERE   
    (dbo.TblFileCache.Skip = 0) 
ORDER BY 
    dbo.TblFileCache.FirstName, dbo.TblFileCache.LastName 
+0

爲什麼你的查詢只返回一行的「達拉斯」?數據中有兩行。 –

+0

請詳細解釋一下。 1.首先,我們可以找到所有的行集,其中第一個名稱不止一次出現,並且姓氏不止一次出現。但是,也許你想要所有的行* pair *(名,姓)出現多次? 2.那麼你是否想要表中所有城市獨特的行中的行?或者每個集合中具有該集合所獨有的城市的行? 3.跳過和訂購怎麼樣? – philipxy

+0

Re 2.或者也許可以通過「但城市與名稱重複的記錄不同」,您只是冗餘地指出,在具有相同名稱對的行中,城市可能不同? – philipxy

回答

4

要獲得所有的行中的原始數據,其中一組用戶名有多個城市中,你可以使用窗口功能:

select t.* 
from (select t.*, 
      min(city) over (partition by FirstName, LastName) as mincity, 
      max(city) over (partition by FirstName, LastName) as maxcity 
     from dbo.TblFileCache t 
    ) t 
where mincity <> maxcity; 

如果你想每個城市一排,你可以做在此之上聚集:

select FirstName, LastName, min(CustomerFileLocation) as CustomerFileLocation, city 
from (select t.*, 
      min(city) over (partition by FirstName, LastName) as mincity, 
      max(city) over (partition by FirstName, LastName) as maxcity 
     from dbo.TblFileCache t 
    ) t 
where mincity <> maxcity 
group by FirstName, LastName, City; 
相關問題