SQL дубликатов выпуск SQL SERVER 2000 - PullRequest
2 голосов
/ 19 мая 2010

У меня есть две таблицы: Product и ProductRateDetail. Родительская таблица - Product. У меня есть дубликаты записей в таблице продуктов, которые должны быть уникальными. В таблице ProductRateDetail есть записи, которые соответствуют повторяющимся записям в таблице продуктов.

Каким-то образом мне нужно обновить таблицу ProductRateDetail, чтобы она соответствовала исходному (более старому) идентификатору из таблицы Product, а затем удалить дубликаты из таблицы Product. Я бы сделал это вручную, но есть сотни записей. то есть что-то вроде

UPDATE tbl_productRateDetail SET productID = (originalID from tbl_product)

тогда что-то вроде

DELETE from tbl_product WHERE duplicate ID

и удалить только недавно добавленные идентификационные данные

пример: (извините, я не могу решить эту проблему с форматированием)

tbl_Product

select * from dbo.Product where ProductCode = '10003'

ProductID    ProductTypeID    ProductDescription       ProductCode     ProductSize
365          1             BEND DOUBLE FLANGED      10003           80mmX90deg
1354            1             BEND DOUBLE FLANGED      10003           80mmX90deg

tbl_ProductRateDetail

SELECT * FROM [MSTS2].[dbo].[ProductRateDetail] WHERE ProductID in (365,1354)

ProductRateDetailID ProductRateID   ProductID   UnitRate
365                    1               365            16.87
1032                   5               365            16.87
2187                   10              365            16.87
2689                   11              365            16.87
3191                   12              365            16.87
7354                   21              1354           21.30
7917                   22              1354           21.30
8480                   23              1354           21.30
9328                   25              1354           21.30
9890                   26              1354           21.30
10452                  27              1354           21.30

Ответы [ 2 ]

1 голос
/ 19 мая 2010

Не проверено, поэтому синтаксис может содержать ошибки.

Сначала возьмите минимальный идентификатор продукта из сгруппированных и обновите записи в ProductRateDetail

UPDATE prd1
SET prd1.ProductID = p2.ProductID
FROM ProductRateDetail prd1
INNER JOIN Product p1 ON
p1.ProductID = prd1.ProductID
INNER JOIN
(
SELECT MIN(ProductID) AS ProductID, ProductTypeID, ProductDescription, ProductCode, ProductSize
FROM Product
GROUP BY ProductTypeID, ProductDescription, ProductCode, ProductSize
) p2 ON
p1.ProductTypeID = p2.ProductTypeID AND
p1.ProductDescription = p2.ProductDescription AND
p1.ProductCode = p2.ProductCode AND
p1.ProductSize = p2.ProductSize

Затем удалите сгруппированные продукты, которые не являются «выбранным» идентификатором

DELETE p1
FROM Product p1
INNER JOIN
(
SELECT MIN(ProductID) AS ProductID, ProductTypeID, ProductDescription, ProductCode, ProductSize
FROM Product
GROUP BY ProductTypeID, ProductDescription, ProductCode, ProductSize
) p2 ON
p1.ProductTypeID = p2.ProductTypeID AND
p1.ProductDescription = p2.ProductDescription AND
p1.ProductCode = p2.ProductCode AND
p1.ProductSize = p2.ProductSize AND
p1.ProductID != p2.ProductID
1 голос
/ 19 мая 2010

примерно так должно работать:

1) Обновление сведений о продукте, которые ссылаются на дубликаты

UPDATE tbl_productRateDetail d
   SET productID = (SELECT MIN(p0.productID)
                      FROM tbl_product p0
                      JOIN tbl_product p1 
                            ON p1.ProductTypeID = p0.ProductTypeID
                           AND p1.ProductDescription = p0.ProductDescription
                           AND p1.ProductCode = p0.ProductCode
                           AND p1.ProductSize = p0.ProductSize
                     WHERE p1.productID = d.productId)
 WHERE productID IN (SELECT productID
                       FROM tbl_product
                      WHERE (ProductTypeID, 
                             ProductDescription, 
                             ProductCode, 
                             ProductSize) IN
                            (SELECT ProductTypeID, 
                                    ProductDescription, 
                                    ProductCode,
                                    ProductSize
                               FROM tbl_product
                              GROUP BY ProductTypeID, 
                                       ProductDescription, 
                                       ProductCode, 
                                       ProductSize
                             HAVING COUNT(*) > 1));

2) Обнаружение дубликатов

DELETE FROM tbl_product p0
 WHERE productID <> (SELECT MIN(productID)
                       FROM tbl_product p1
                      WHERE p1.ProductTypeID = p0.ProductTypeID
                        AND p1.ProductDescription = p0.ProductDescription
                        AND p1.ProductCode = p0.ProductCode
                        AND p1.ProductSize = p0.ProductSize);
...