SQL SERVER 2000的SQL重复问题
我有两张表:Product和ProductRateDetail。父表是Product。我在产品表中有重复的记录,这些记录必须是唯一的。ProductRateDetail表中的条目与product表中的重复记录相对应 不知何故,我需要更新ProductRateDetail表以匹配Product表中的原始旧ID,然后从Product表中删除重复的ID。我会手动执行此操作,但有100条记录。i、 例如 更新tbl\U productRateDetail SET productID=来自tbl\U product的原始有效ID 然后像 从具有重复ID的tbl_产品中删除 并且只删除最近添加的ID数据 示例:抱歉,无法解决此格式化问题 tbl_产品 tbl_产品详细信息SQL SERVER 2000的SQL重复问题,sql,sql-server,tsql,sql-server-2000,Sql,Sql Server,Tsql,Sql Server 2000,我有两张表:Product和ProductRateDetail。父表是Product。我在产品表中有重复的记录,这些记录必须是唯一的。ProductRateDetail表中的条目与product表中的重复记录相对应 不知何故,我需要更新ProductRateDetail表以匹配Product表中的原始旧ID,然后从Product表中删除重复的ID。我会手动执行此操作,但有100条记录。i、 例如 更新tbl\U productRateDetail SET productID=来自tbl\U pr
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
像这样的方法应该会奏效: 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));
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);
2个Detele副本
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));
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);
未测试,因此语法可能有一些错误 首先,从分组的产品id中获取最小的产品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
两个表中都不存在这些列唯一链接表的列是ProductID。@杰夫:你说得对。我更新了我的答案,希望这会起作用。乍一看,这似乎会起作用。。。谢谢你的帮助!一旦我测试它,它将标记为已回答。