合并记录并删除SQLServer 2005中的重复项

时间:2013-10-25 10:51:39

标签: sql-server-2005

我们有一张订单表,里面几乎没有重复。但重复项不完全重复。

假设我有订单表:

CREATE TABLE orders 
  ( 
     order_id             INT, 
     order_number         INT, 
     customer_id          VARCHAR(34), 
     tb_register_no       INT, 
     tb_customer_id       VARCHAR(7), 
     tb_customer_no       VARCHAR(10), 
     tb_store_no          INT, 
     tb_trans_no          INT, 
     tb_trans_category_id VARCHAR(4), 
     sales_associate_no   VARCHAR(5), 
     date_booked          VARCHAR(7) 
  ); 



INSERT INTO orders
    (`order_id`, `Order_number`, `Customer_Id`, `tb_register_no`, `tb_customer_id`, `tb_customer_no`, `tb_store_no`, `tb_trans_no`, `tb_trans_category_id`, `sales_associate_no`, `date_booked`)
VALUES
    (1, 1001, NULL, 3, NULL, NULL, 235, 1001, '2', '52279', '00:00.0'),
    (2, 1001, '0x331EFC0429A811E39742643150505996', 3, '3479899', '8883724945', 235, 1001, NULL, NULL, '00:00.0'),
    (3, 1014, NULL, 2, NULL, NULL, 235, 1014, '2', '52275', '00:00.0'),
    (4, 1014, '0x330E5A3429A811E39742643150505996', 2, '3479876', '8883722810', 235, 1014, NULL, NULL, '00:00.0')
;

所以我需要为所有具有相同order_number,tb_register_no,tb_store_no,tb_trans_no,date_booked的ordres订购一个订单。这意味着我需要将带有order_id 1和2的记录合并到一个记录中,并从其他记录填充NULLs。我们怎么做到这一点?

这将在SQLServer 2005中完成。合并这样的行后,我需要删除其他重复的ordres(如果我们将order_id 1的行合并为2,则必须删除order_id 1的行)。

1 个答案:

答案 0 :(得分:1)

从你描述它的方式 - 我会在这一行上说些什么:

UPDATE O
    SET 
    Customer_Id = ISNULL(O.Customer_Id, O2.Customer_Id)
    ...remainder fields...
FROM dbo.orders AS O
INNER JOIN dbo.orders AS O2 ON 
                o.Order_number = o2.Order_number 
                AND o.order_id <> o2.order_id

这将使用第一个非空字段更新Order。 然后你可以删除副本。