#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, предоставленный Фрэнком Шмиттом, чтобы увидеть, что отличает эти строки.