2010-05-19 5 views
2

J'ai deux tables: Product et ProductRateDetail. La table parent est Product. J'ai des enregistrements en double dans la table des produits qui doivent être uniques. Il y a des entrées dans la table ProductRateDetail qui correspondent à des enregistrements en double dans la table des produits.Duplicates SQL Problème SQL SERVER 2000

D'une manière ou d'une autre, j'ai besoin de mettre à jour la table ProductRateDetail pour qu'elle corresponde à l'ID original (ancien) de la table Product, puis supprimer les doublons de la table product. Je le ferais manuellement mais il y a des centaines d'enregistrements. à-dire quelque chose comme

UPDATE tbl_productRateDetail SET productID = (originalID from tbl_product)

alors quelque chose comme

DELETE from tbl_product WHERE duplicate ID

et seulement supprimer les données d'identification récemment ajoutées

exemple: (désolé ne peut pas travailler sur cette chose de formatage)

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 

Répondre

1

Non testé, donc syntaxe peut avoir quelques erreurs.

D'abord, prenez l'ID minimum de produit de ceux regroupés, et les dossiers de mise à jour dans 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 

Ensuite, supprimez les produits regroupés que ne sont pas les « sélectionnés » id

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 
+0

à première vue cela ressemble à ça va marcher ... merci pour votre aide! Marquer comme répondu une fois que je l'ai testé. – jhowe

1

quelque chose comme cela devrait fonctionner:

1) mise à jour Détails du produit que les références dupliquent

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

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); 
+0

Ces colonnes font n'existe pas dans les deux tables la seule colonne reliant les tables est ProductID. – jhowe

+0

@jeff: vous avez raison. J'ai mis à jour ma réponse, j'espère que cela fonctionnera. –