从重复的行中选择一行

时间:2009-09-08 14:47:04

标签: sql sql-server sql-server-2005 tsql

我有一个loooooong存储过程,它在数据库中的不同表中运行大约15个select语句 - 我将所有选择的结果插入到临时表中。但是 - 该表有一些完全重复的行。临时表看起来像这样:

DocID   | VisitDate            | DocName
8245376 | 8/26/2009 1:07:01 PM | Doc1   
8245376 | 8/26/2009 1:07:01 PM | Doc1   
8245376 | 8/26/2009 1:07:01 PM | Doc2   
8245376 | 8/26/2009 1:07:01 PM | Doc2   
646681  | 8/26/2009 1:07:01 PM | Doc3    
263272  | 8/26/2009 1:07:01 PM | Doc4   
8245376 | 8/26/2009 1:07:01 PM | Doc5   
8245376 | 8/26/2009 1:07:01 PM | Doc5   
8245376 | 8/26/2009 1:07:01 PM | Doc6   
8245376 | 8/26/2009 1:07:01 PM | Doc6   
1903875 | 8/26/2009 1:07:01 PM | Doc7

我希望桌子看到最后的结果是这样的:

DocID   | VisitDate            | DocName
8245376 | 8/26/2009 1:07:01 PM | Doc1   
8245376 | 8/26/2009 1:07:01 PM | Doc2   
646681  | 8/26/2009 1:07:01 PM | Doc3    
263272  | 8/26/2009 1:07:01 PM | Doc4   
8245376 | 8/26/2009 1:07:01 PM | Doc5   
8245376 | 8/26/2009 1:07:01 PM | Doc6   
1903875 | 8/26/2009 1:07:01 PM | Doc7

如果有多个重复行且仍返回不重复的行,如何只返回一行?

4 个答案:

答案 0 :(得分:9)

SELECT  DISTINCT DocID, VisitDate, DocName
FROM    mytable

或者我错过了什么?

<强>更新

如果您可以控制存储过程,则可以重写它,以便不会重复进入表中。

假设DocIDPRIMARY KEY,请使用IGNORE_DUP_KEY在临时表中声明DECLARE @temp TABLE (DocId INT NOT NULL PRIMARY KEY WITH (IGNORE_DUP_KEY = ON), …) INSERT INTO @mytable SELECT … FROM source_table

DocID

这将跳过{{1}}

上的重复项

答案 1 :(得分:2)

尝试使用SELECT DISTINCT代替SELECTDISTINCT关键字将删除重复值

答案 2 :(得分:2)

如果重复项来自源表,则在对临时表进行插入时执行SELECT DISTINCT。

如果重复项是表,那么在插入所有行后,只需从临时表中执行SELECT DISTINCT。

尝试实际从表中删除重复的行需要更多参与,但这里似乎没有必要,因为您正在使用临时表。

答案 3 :(得分:0)

如果你想从临时表或更好的方法中删除重复项,请不要将它们放在那里,将多个选择转换为更大的联合查询并将该结果插入临时表。

相关问题