Найти дубликаты в SQL и ОБНОВИТЬ их?

#sql #sql-server #select #stored-procedures #sql-update

#sql #sql-сервер #выберите #хранимые процедуры #sql-обновить

Вопрос:

Я пытаюсь найти все дубликаты в таблице и изменить одно из их значений. Теперь я использую:

 SELECT Amount
FROM Bids
GROUP BY Amount, AuctionID
HAVING ( COUNT(Amount) > 1 ) AND  (AuctionID=1)
  

Проблема в том, что он возвращает только

 Amount
23.6500
41.8800
42.3500
  

И не

 Amount
23.6500
23.6500
41.8800
41.8800
42.3500
42.3500
  

Итак, я не могу ОБНОВИТЬ все строки.

Как я могу получить это так, как я показал?

Спасибо, Дэн

Ответ №1:

Просто оберните это внутри запроса IN:

 SELECT Amount
FROM Bids
WHERE Amount IN (
  SELECT Amount
  FROM Bids
  GROUP BY Amount, AuctionID
  HAVING ( COUNT(Amount) > 1 ) AND  (AuctionID=1)
)
  

ОБНОВЛЕНИЕ: добавлена инструкция UPDATE

 UPDATE Bids
SET Burned = 1
WHERE Amount IN (
  SELECT Amount
  FROM Bids
  GROUP BY Amount, AuctionID
  HAVING ( COUNT(Amount) > 1 ) AND  (AuctionID=1)
)
  

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

1. Спасибо, это работает. Теперь, как я могу ОБНОВИТЬ эти таблицы, чтобы УСТАНОВИТЬ Burned = 1?

2. @Danpe Я добавил инструкцию UPDATE к ответу

Ответ №2:

Предположим, что у вас есть идентификатор в таблице ставок:

  SELECT Amount
 FROM Bids b1
 WHERE AcutionId = 1
 AND EXISTS (Select 1 from Bids b2 
             WHERE b2.AuctionID = b1.AuctionId 
             AND b1.Amount = b2.Amount
             AND b1.Id <> b2.Id)
  

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

1. Ваш exists всегда будет true. Может быть, вы подумали b2.Id != b1.Id

2. @dugokontov, ты прав, нужен хотя бы идентификатор (надеюсь, он существует)

Ответ №3:

Мне любопытно узнать, почему ваш оригинальный select не удовлетворяет вашим требованиям. Если для каждого элемента в наборе дубликатов вы выбираете только один из них, то у вас есть один для обновления. Было бы полезно добавить AuctionID в select, предоставленный Фрэнком Шмиттом, чтобы увидеть, что отличает эти строки.