2016-10-13 19 views
0

我有這個查詢可以工作並返回正確的重複數據。Tsql查詢需要查找重複項和連接表以確定要刪除哪些項

select [serverName], ActiveYN, count(servername) 
from dbo.FarmStats_Server 
group by [serverName], ActiveYN 
having (count(servername) > 1) 

返回260行。

我需要做的是更復雜一點。

SELECT 
    dbo.FarmStats_Farm.FarmName, 
    dbo.FarmStats_Server.ServerName, 
    dbo.FarmStats_Server.obsDT, dbo.FarmStats_Server.ActiveYN 
FROM 
    dbo.FarmStats_Farm 
INNER JOIN 
    dbo.FarmStats_Server ON dbo.FarmStats_Farm.FarmID = dbo.FarmStats_Server.FarmIDFK 
GROUP BY 
    dbo.FarmStats_Farm.FarmName, dbo.FarmStats_Server.ServerName, dbo.FarmStats_Server.obsDT, dbo.FarmStats_Server.ActiveYN 
HAVING 
    (COUNT(dbo.FarmStats_Server.ServerName) > 1) 

此查詢返回任何結果。我從根本上失去了一些東西。

最終目標是刪除其中一個副本。

感謝您的幫助。

+0

當您運行且不包括羣組由部分查詢返回什麼?如果你得到了結果,你可以看看是否有重複。您的INNER JOIN可能會過濾出您不希望的數據。 –

+0

@Jay你想只刪除一個副本還是隻保留一條記錄?所以如果你有3個記錄具有相同的[serverName]和[ActiveYN],你想要兩個還是隻剩下一個? –

+0

埃裏克你是對的。這裏的目標是根據年齡刪除重複的記錄。最新的將被設置爲激活,其餘的將需要從表格中移除。 – Jay

回答

0

可以在子查詢如下使用:

SELECT 
    dbo.FarmStats_Farm.FarmName, 
    dbo.FarmStats_Server.ServerName, 
    dbo.FarmStats_Server.obsDT, 
    dbo.FarmStats_Server.ActiveYN 
FROM dbo.FarmStats_Farm 
INNER JOIN dbo.FarmStats_Server fs 
    ON dbo.FarmStats_Farm.FarmID = 
    dbo.FarmStats_Server.FarmIDFK 
WHERE EXISTS (SELECT 
    [serverName], 
    ActiveYN 
FROM dbo.FarmStats_Server 
WHERE servername = fs.servername 
AND activeyn = fs.activeyn 
GROUP BY [serverName], 
      ActiveYN 
HAVING (COUNT(servername) > 1)) 
+0

我想我明白你想要完成什麼。子查詢不會將結果限制爲重複。它顯示了表格中的所有記錄。 – Jay