2010-09-22 82 views
2

下面的代码说明了我正在努力完成的最好的事情。我知道我可以使用游标或其他循环例程来遍历记录来查找重复项,并根据找到的内容创建笔记记录。我试图避免这种情况,除非没有更好的选择。数据重复数据删除

DROP TABLE #orig 
DROP TABLE #parts 
DROP TABLE #part_notes 

CREATE TABLE #orig(partnum VARCHAR(20), notes VARCHAR(100)); 
INSERT INTO #orig VALUES ('A123', 'To be used on Hyster models only') 
INSERT INTO #orig VALUES ('A123', 'Right Hand model only') 
INSERT INTO #orig VALUES ('A125', 'Not to be used by Jerry') 
INSERT INTO #orig VALUES ('A125', NULL) 
INSERT INTO #orig VALUES ('A125', 'asdfasdlfj;lsdf') 
INSERT INTO #orig VALUES ('A128', 'David test') 
INSERT INTO #orig VALUES ('A129', 'Fake part') 

SELECT COUNT(*) FROM #orig 

-- SHOW ME UNIQUE PARTS, MY PARTS TABLE SHOULD BE UNIQUE! 
SELECT DISTINCT partnum FROM #orig 


CREATE TABLE #parts(id INT IDENTITY(1,1), partnum VARCHAR(20)); 
INSERT INTO #parts 
SELECT DISTINCT partnum FROM #orig 

SELECT * FROM #parts 

CREATE TABLE #part_notes(id INT IDENTITY(1,1), part_id INT, line_number INT, notes VARCHAR(100)); 
/* 
    HOW DO I AT THIS POINT POPULATE the #part_notes table so that it looks like this: 
    (note: any NULL or empty note strings should be ignored) 

    id part_id line_number notes 
    1 1  1   To be used on Hyster models only  
    2 1  2   Right Hand model only 
    3 2  1   Not to be used by Jerry 
    4 2  2   asdfasdlfj;lsdf 
    6 3  1   David test 
    7 4  1   Fake part 

*/ 
+0

'line_number'应该如何归因?如果没有'ORDER BY',来自'orig'的行将不按特定顺序读取。 – eumiro 2010-09-22 12:25:44

回答

1

以下只是随意选择line_numbers,因为似乎没有在数据适合order by什么。

SELECT p.id part_id, 
     p.partnum , 
     ROW_NUMBER() over (partition BY p.id ORDER BY (SELECT 0)) line_number, 
     notes 
FROM  #parts p 
     JOIN #orig o 
     ON  o.partnum=p.partnum 
WHERE notes IS NOT NULL 
AND  notes   <> '' 
ORDER BY part_id 
+0

这对我来说很完美。由于目前笔记没有订单,所以我不关心它们添加的顺序。谢谢! – dtaylo04 2010-09-22 20:06:15

+0

马丁 - 有没有办法第二次运行这个脚本,并有line_number开始在当前line_number + 1该part_id? – dtaylo04 2010-09-22 21:03:55

+0

回答了我自己的问题: 'ROW_NUMBER()over(分区BY p.id ORDER BY(SELECT 0))+ ISNULL(MAX(n.line_number),0)line_number' 并包含左外连接: ' LEFT OUTER JOIN #part_notes n on p.id = n.part_id' 您还需要添加“Group By”子句。 – dtaylo04 2010-09-22 21:21:59