Запрос Tsql должен находить дубликаты и объединять таблицы, чтобы определить, какие из них следует удалить

#sql-server #tsql

#sql-server #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. что возвращается при выполнении запроса без группы по разделам? Если вы получите результаты, можете ли вы посмотреть, есть ли в этом какие-либо дубликаты. Возможно, ваше ВНУТРЕННЕЕ СОЕДИНЕНИЕ отфильтровывает данные, которые вы не ожидаете.

2. @Jay Вы хотите удалить только один дубликат или сохранить только одну запись? Итак, если у вас есть 3 записи с одинаковыми [ServerName] и [ActiveYN], вы хотите, чтобы остались две или только одна?

3. Эрик, ты прав. цель здесь — удалить повторяющиеся записи в зависимости от возраста. для самого нового будет установлено значение active, остальные необходимо будет удалить из таблицы.

Ответ №1:

Вы можете использовать это в подзапросе, как показано ниже:

 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))
 

Комментарии:

1. Я думаю, я понимаю, чего вы пытаетесь достичь. Вложенный запрос не ограничивает результат только дубликатами. В нем представлены все записи в таблице.