【问题标题】:SQL Duplicates Issue SQL SERVER 2000SQL 重复问题 SQL SERVER 2000
【发布时间】:2010-05-19 15:17:03
【问题描述】:

我有两个表:Product 和 ProductRateDetail。父表是产品。我在产品表中有重复的记录,这些记录需要是唯一的。 ProductRateDetail 表中有对应于产品表中重复记录的条目。

不知何故,我需要更新 ProductRateDetail 表以匹配 Product 表中的原始(旧)ID,然后从 product 表中删除重复项。我会手动执行此操作,但有 100 条记录。即类似

UPDATE tbl_productRateDetail SET productID = (originalID from tbl_product)

然后类似

DELETE from tbl_product WHERE duplicate ID

并且只删除最近添加的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

【问题讨论】:

    标签: sql sql-server tsql sql-server-2000


    【解决方案1】:

    未经测试,所以语法可能有一些错误。

    首先,从分组的产品中取出最小的产品id,并更新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
    

    然后,删除不是“选定”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
    

    【讨论】:

    • 乍一看这似乎可行...感谢您的帮助!测试后将标记为已回答。
    【解决方案2】:

    这样的事情应该可以工作:

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

    【讨论】:

    • 这些列在两个表中都不存在,链接这些表的唯一列是 ProductID。
    • @jeff:你是对的。我更新了我的答案,希望这会奏效。
    猜你喜欢
    • 2011-04-24
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 2016-03-28
    相关资源
    最近更新 更多