2016-10-13 3 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) 

このクエリは結果を返しません。基本的に何かが欠けている。

最後の目標は、重複の1つを削除することです。

ありがとうございました。

+0

クエリを実行したときのセクションによってグループなしで返されますでしょうか?結果が得られれば、その中に重複があるかどうか確認できます。あなたのINNER JOINがあなたが期待していないデータを除外しているかもしれません。 –

+0

@Jay 1つの複製を削除するか、1つのレコードのみを保持しますか?したがって、同じ[serverName]と[ActiveYN]の3つのレコードがある場合は、2つを残すか1つだけにしますか? –

+0

Ericあなたは正しいです。ここでの目標は、年齢に基づいて重複レコードを削除することです。最新のものがアクティブに設定され、残りはテーブルから削除する必要があります。 – 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

私はあなたが達成しようとしていることを理解していると思います。 Sub Queryは結果を重複に限定しません。それはテーブルのすべてのレコードを表示します。 – Jay

関連する問題