我有一个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
如果有多个重复行且仍返回不重复的行,如何只返回一行?
答案 0 :(得分:9)
SELECT DISTINCT DocID, VisitDate, DocName
FROM mytable
或者我错过了什么?
<强>更新强>
如果您可以控制存储过程,则可以重写它,以便不会重复进入表中。
假设DocID
是PRIMARY 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
代替SELECT
。 DISTINCT
关键字将删除重复值
答案 2 :(得分:2)
如果重复项来自源表,则在对临时表进行插入时执行SELECT DISTINCT。
如果重复项是跨表,那么在插入所有行后,只需从临时表中执行SELECT DISTINCT。
尝试实际从表中删除重复的行需要更多参与,但这里似乎没有必要,因为您正在使用临时表。
答案 3 :(得分:0)
如果你想从临时表或更好的方法中删除重复项,请不要将它们放在那里,将多个选择转换为更大的联合查询并将该结果插入临时表。