Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL SERVER 2000的SQL重复问题_Sql_Sql Server_Tsql_Sql Server 2000 - Fatal编程技术网

SQL SERVER 2000的SQL重复问题

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

我有两张表: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_产品详细信息

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。@杰夫:你说得对。我更新了我的答案,希望这会起作用。乍一看,这似乎会起作用。。。谢谢你的帮助!一旦我测试它,它将标记为已回答。